一、命令分类
数据类型相关命令
string类型命令
# 设置值
SET key value
# 获取值
GET key
# 获取值的长度
STRLEN key
# 自增
INCR key
# 浮点数自增
INCRBYFLOAT key increment
# 范围获取字符串
GETRANGE key start end
# 获取并重新设置新值
GETSET key value
# 批量设置值
MSET key1 value1 key2 value2 key3 value3
# 批量获取值
MGET key1 key2 key3
list类型命令
# 右侧压入新元素
RPUSH key value
# 左侧压入新元素
LPUSH key value
# 总是往右侧弹出一个元素
RPOP key
# 总是往左侧弹出一个元素
LPOP key
# 获取列表长度
LLEN key
# 获取列表指定范围内的元素
LRANGE key start stop
# 从一个列表的最后边去除一个元素,插入到另一个列表的最前边并返回插入的元素。
RPOPLPUSH source destination
set类型命令
# 添加元素
SADD key member
# 移除元素
SREM key member
# 获取集合中的所有成员
SMEMBERS key
# 获取集合中元素的数量
SCARD key
# 判断集合中是否包含该元素
SISMEMBER key member
hash类型命令
# 向hash中添加一个域
HSET key field value
# 获取给定域的值
HGET key field
# 删除一个或多个键值对
HDEL key field1 field2
# 判断给定域是否存在
HEXISTS key field
# 获取指定hash中全部域和值
HGETALL key
zset类型命令
# 添加有序集合成员
ZADD key score member
# 获取有序集合成员数量
ZCARD key
# 获取指定成员的分值(排名)
ZRANK key member
# 获取指定排名范围的分值和成员
ZRANGE key start stop [WITHSCORES]
服务器相关命令
# 查找所有符合给定模式(pattern)的键
KEYS pattern
# 测试连接是否仍然生效
PING
# 返回Redis的各种信息和统计数值
INFO [section]
# 获取redis服务器的配置信息
CONFIG GET parameter
事务相关命令
# 取消事务,放弃之前所有命令的执行
DISCARD
# 标记一个事务块的开始
MULTI
# 执行所有事务块内的命令
EXEC
# 监视给定的keys
WATCH key
发布订阅模式相关命令
# 订阅一个或多个符合给定channel模式的频道
PSUBSCRIBE pattern1 [pattern2 ...]
# 退订一个或多个符合给定channel模式的的频道
PUNSUBSCRIBE pattern1 [pattern2 ...]
# 退订所有频道
PUNSUBSCRIBE
# 订阅给定的一个或多个频道
SUBSCRIBE channel1 [channel2 ...]
# 退订给定的一个或多个频道
UNSUBSCRIBE channel1 [channel2 ...]
# 退订所有频道
UNSUBSCRIBE
# 向指定频道发送消息
PUBLISH channel message
管道相关命令
# 发送多个命令,不获取返回值
PIPEWATCH [ABORT|EXEC]
# 发送多个命令,并获取命令的执行结果
PIPELINE
服务器管理相关命令
# 立即杀掉Redis服务器
SHUTDOWN [NOSAVE|SAVE]
# 异步执行一个 AOF(AppendOnlyFile) 文件重写操作
BGREWRITEAOF
# 异步执行一个快照操作,将数据集快照存储到磁盘上的一个文件中
BGSAVE
集群相关命令
# 检查节点状态
CLUSTER INFO
# 获取节点ID
CLUSTER NODES
# 打印集群状态
CLUSTER NODES-RAW
二、命令使用技巧
在Redis的使用过程中为了更高效的处理问题需要了解一些常用的技巧
下面是几个Redis命令使用技巧
筛选key
使用keys命令结合正则表达式可以快速筛选出符合条件的key。
# 筛选以"user"开头的key
keys user*
通过上述命令可以快速筛选出所有以”user”开头的key,方便我们快速获取所需要的数据
使用管道批量操作
使用管道命令可以高效的执行多个命令减少网络开销
# 批量写入数据
set key1 value1
set key2 value2
set key3 value3
# 批量读取数据
get key1
get key2
get key3
上述命令如果单个执行会有多次网络开销效率低下。使用管道命令可以同步执行多个命令,减少网络开销提高效率。
# 批量写入数据
set key1 value1 | set key2 value2 | set key3 value3
# 批量读取数据
get key1 | get key2 | get key3
事务操作
使用事务相关命令可以实现多个命令的原子操作。
# 开启事务
MULTI
# 执行多个命令
set key1 value1
set key2 value2
set key3 value3
# 提交事务
EXEC
如果在上述执行命令期间Redis发生异常有可能会导致中途出现问题,导致数据不完整或者出现错误。使用事务相关命令可以让多个命令原子化的执行,如果出现异常可以自动撤销之前执行的命令避免数据不完整或者出现错误。
不同数据类型间的转换
Redis支持不同数据类型之间的转换,方便我们在处理数据时使用。
# set类型转换为list类型
SMEMBERS key1 | XARGS LPUSH key2
# list类型转换为set类型
LRANGE key1 0 -1 | XARGS SADD key2
# set类型转换为zset类型
SMEMBERS key1 | XARGS ZADD key2 0
上述命令可以快速的将set类型,list类型,和zset类型相互转换,方便我们在处理数据时使用。
使用set数据类型模拟分布式锁
利用set类型的特性可以快速的实现分布式锁
# 加锁
SETNX lock true
# 解锁
DEL lock
通过使用上述命令可以快速的实现分布式锁的机制,防止多个进程同时操作同一个资源造成数据不一致的问题。
使用bitmap类型实现惊喜红包功能
利用bitmap类型的位运算可以方便的实现惊喜红包功能
# 初始化bitmap
SETBIT red_packet 0 1
SETBIT red_packet 1 1
SETBIT red_packet 2 1
# 获取随机数
rand = RANDOM() % 3
# 检查红包是否存在
ISSET red_packet rand
使用上述命令可以快速的实现惊喜红包功能方便我们在使用Redis时使用bitmap类型实现一些高效的功能
三、常用命令详解
string类型命令
string类型是Redis最基本的数据类型,可以存储字符串、数字、json、图片等二进制文件
常用的命令如下:
set命令
# 设置key-value
set key value
get命令
# 获取key的value
get key
mset命令
# 设置多个key-value
mset key1 value1 key2 value2
mget命令
# 获取多个key的value
mget key1 key2
list类型命令
list类型是一种双向链表结构,其每个节点都包含一个字符串类型的元素
常用的命令如下:
lpush命令
# 向list的头部插入一个value
lpush key value
rpush命令
# 向list的尾部插入一个value
rpush key value
rpop命令
# 从list的尾部删除一个元素并返回该元素
rpop key
lpop命令
# 从list的头部删除一个元素并返回该元素
lpop key
set类型命令
set类型是一种无序 不可重复的集合
常用的命令如下:
sadd命令
# 添加一个或多个元素到set中
sadd key member1 member2...
spop命令
# 随机移除一个元素并返回该元素
spop key
sismember命令
# 判断元素member是否在set中,返回1表示存在,0表示不存在
sismember key member
smembers命令
# 返回set中的所有元素
smembers key
hash类型命令
hash类型是一种键值对的集合,其key为字符串类型value为任意类型
常用的命令如下:
hset命令
# 向hash中设置一个键值对
hset key field value
hget命令
# 获取hash中指定key的value
hget key field
hgetall命令
# 获取hash中所有key-value
hgetall key
hincrby命令
# 将指定的key的value按指定的增量增加
hincrby key field increment
zset类型命令
zset类型实际上是一种有序集合,其每个元素都对应一个分数可以按照分数进行排序
常用的命令如下:
zadd命令
# 向zset中添加一个元素,score为该元素的分数
zadd key score1 member1 score2 member2...
zrem命令
# 从zset中删除一个或多个元素
zrem key member1 member2...
zrange命令
# 获取zset中指定排名范围内的元素
zrange key start end
zscore命令
# 获取指定元素的分数
zscore key member
四、常见问题整理
Redis中使用命令时需要注意哪些细节
在使用 Redis 命令时需要注意:
- Redis是单线程的,多个客户端并发访问时需要注意线程安全问题
- 使用命令时需要注意选择合适的数据类型尽量避免数据冗余和重复
- 避免一次性操作大量数据可适当分批次操作
- 在使用有序集合或列表时尽量使用索引避免全量查询
Redis命令执行异常常见原因有哪些
在实际使用时有时可能会遇到Redis命令执行异常的情况
其常见原因包括:
- 网络中断或连接超时
- Redis 进程崩溃或停止服务
- 操作的数据不存在或已删除
- Redis 内存耗尽
- Redis 日志文件过大
Redis如何实现分布式锁
在分布式系统中需要保证同一份数据在同一时间只能被一个线程进行修改
这时候可以利用Redis来实现分布式锁
具体过程如下:
- 利用Redis中的set命令设置key和value
- 利用set命令中的NX和EX参数实现原子性的判断key是否存在和设置key和value的过期时间
- 利用getset命令实现原子性的获取旧值和设置新值并判断是否为自己加的锁
以下为 Java 示例代码:
public class RedisLock {
private RedisTemplate redisTemplate;
private String key;
private String value;
private int expireTime;
public RedisLock(RedisTemplate redisTemplate, String key, String value, int expireTime) {
this.redisTemplate = redisTemplate;
this.key = key;
this.value = value;
this.expireTime = expireTime;
}
public boolean lock() {
String luaScript = "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 " +
"then return redis.call('expire', KEYS[1], ARGV[2]) else return 0 end";
RedisScript<Long> script = new DefaultRedisScript<>(luaScript, Long.class);
Long result = (Long) redisTemplate.execute(script, Collections.singletonList(key), value, expireTime);
return result != null && result == 1;
}
public boolean unlock() {
String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] " +
"then return redis.call('del', KEYS[1]) else return 0 end";
RedisScript<Long> script = new DefaultRedisScript<>(luaScript, Long.class);
Long result = (Long) redisTemplate.execute(script, Collections.singletonList(key), value);
return result != null && result == 1;
}
}
Redis如何进行事务操作
Redis支持事务操作可以将多个命令打包成一个事务一次性执行
具体过程如下:
- 利用Redis中的multi命令开启事务
- 利用exec命令执行所有的事务命令
以下为 Java 示例代码:
public void transaction() {
List<Object> results = redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public <K, V> List<Object> execute(RedisOperations<K, V> operations) throws DataAccessException {
operations.watch("key");
// 开启事务
operations.multi();
operations.opsForValue().increment("key", 1);
operations.opsForValue().decrement("otherKey", 1);
// 执行事务
return operations.exec();
}
});
System.out.println(results);
}
Redis如何实现持久化
Redis支持数据持久化可以选择RDB或AOF两种方式实现
具体过程如下:
- RDB方式实现快照持久化是把当前内存中的数据定时写入磁盘文件
- AOF方式实现持久化是把所有的写操作都写入一个追加的文件中
- 可以同时使用RDB和AOF两种方式进行持久化以达到更好的数据可靠性
以下为 Java 示例代码:
// 使用 RDB 方式进行持久化
redisTemplate.execute(new RedisCallback() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.save();
return null;
}
});
// 使用 AOF 方式进行持久化
redisTemplate.execute(new RedisCallback() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.flushDb();
return null;
}
});
Redis如何实现缓存功能
Redis可以作为缓存服务器来提升系统性能
具体过程如下:
- 使用set、get等操作实现数据的缓存
- 使用过期设置功能实现缓存数据的自动失效
- 定期使用 LRU机制删除长时间未使用的缓存数据避免内存溢出
以下为 Java 示例代码:
public Object getData(String key) {
Object data = redisTemplate.opsForValue().get(key);
if (data == null) {
// 如果缓存中不存在该数据,则查询数据库,并将该数据插入缓存中
data = fetchDataFromDB();
if (data != null) {
redisTemplate.opsForValue().set(key, data, 5, TimeUnit.MINUTES);
}
}
return data;
}
void deleteCache(String key) {
redisTemplate.delete(key);
}
Redis如何实现消息队列功能
Redis可以用作消息队列来实现异步处理等功能
具体过程如下:
- 使用Redis中list数据类型实现队列push命令添加消息pop命令获取消息
- 使用Redis中的pub/sub消息订阅功能实现发布-订阅模式
- 使用Redis可持久化功能实现消息持久化和恢复
以下为 Java 示例代码:
// 发送消息
redisTemplate.convertAndSend("message_channel", "hello world");
// 接收消息
public static class MessageListener {
@Autowired
private RedisConnectionFactory connectionFactory;
// 在 Spring 初始化时进行监听
@PostConstruct
public void listen() {
RedisConnection connection = connectionFactory.getConnection();
connection.subscribe(new MessageListenerAdapter(), "message_channel");
connection.close();
}
private static class MessageListenerAdapter implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
System.out.println("Received message: " + new String(message.getBody()));
}
}
}
五、小结
Redis支持的数据类型和命令非常丰富,具体使用需要根据实际需求灵活运用,欢迎大家一起总结整理共同进步!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/144180.html