t1 1 (integer) 1 127.0.0.1:6379[2]> smembers set1 // 返回set1中的所有元素 1) "0" 2) "1" 127.0.0.1:6379[2]> scard set1 // 返回set的基数 (integer) 2 127.0.0.1:6379[2]> sismember set1 0 // 测试set1中是否包含元素0 (integer) 1 127.0.0.1:6379[2]> srandmember set1 // 随机返回一个元素 "0" 127.0.0.1:6379[2]> sadd set2 0 (integer) 1 127.0.0.1:6379[2]> sadd set2 2 (integer) 1 127.0.0.1:6379[2]> sinter set1 set2 // 求交集 1) "0" 127.0.0.1:6379[2]> sinterstore set3 set1 set2 // 保存交集到set3 (integer) 1 127.0.0.1:6379[2]> smembers set3 1) "0" 127.0.0.1:6379[2]> sunion set1 set2 // 求并集 1) "0" 2) "1" 3) "2" 127.0.0.1:6379[2]> sdiff set1 set2 // 求差集 1) "1" 127.0.0.1:6379[2]> sdiff set2 set1 1) "2"
对zset的操作
zset是一种有序集合(sorted set), 其中每个元素都关联一个序号score.
常见操作有zrange, zadd, zrevrange等
127.0.0.1:6379[2]> zadd zset1 1 dianping.com // 添加元素, score为1 (integer) 1 127.0.0.1:6379[2]> zadd zset1 2 baidu.com (integer) 1 127.0.0.1:6379[2]> zadd zset1 3 qq.com (integer) 1 127.0.0.1:6379[2]> zcard zset1 // 返回zset的基数 (integer) 3 127.0.0.1:6379[2]> zscore zset1 dianping.com // 返回元素的score "1" 127.0.0.1:6379[2]> zrank zset1 dianping.com // 返回元素的rank (integer) 0 127.0.0.1:6379[2]> zrange zset1 0 1 // 选取元素, score 从小到大 1) "dianping.com" 2) "baidu.com" 127.0.0.1:6379[2]> zrevrange zset1 0 1 // score从大到小 1) "qq.com" 2) "baidu.com" 127.0.0.1:6379[2]> zrem zset1 qq.com // 删除元素 (integer) 0 127.0.0.1:6379[2]> zincrby zset1 5 taobao.com // 如果元素不存在, 则添加该元素, 设置score为5 "5" 127.0.0.1:6379[2]> zcard zset1 (integer) 3 127.0.0.1:6379[2]> zincrby zset1 10 dianping.com // 如果元素存在, 则其score增加10 "11" 127.0.0.1:6379[2]> zrange zset1 0 10 withscores 1) "taobao.com" 2) "5" 3) "dianping.com" 4) "11"
此外, 还有zrevrank, zrevrange, zrangebyscore, zremrangebyrank, zramrangebyscore, zinterstore/zunionstore等操作.
对hash的操作
hash也是一种非常常见的结构.
127.0.0.1:6379[2]> hset hash1 key1 value1 // 添加元素 (integer) 1 127.0.0.1:6379[2]> hget hash1 key1 // 获取元素的value "value1" 127.0.0.1:6379[2]> hexists hash1 key1 (integer) 1 127.0.0.1:6379[2]> hset hash1 key2 value2 (integer) 1 127.0.0.1:6379[2]> hlen hash1 (integer) 2 127.0.0.1:6379[2]> hkeys hash1 // 获取hash1的所有key 1) "key1" 2) "key2" 127.0.0.1:6379[2]> hvals hash1 // 获取hash1的所有value 1) "value1" 2) "value2" 127.0.0.1:6379[2]> hmget hash1 key1 key2 // 获取元素 1) "value1" 2) "value2" 127.0.0.1:6379[2]> hgetall hash1 // 获取key/value 1) "key1" 2) "value1" 3) "key2" 4) "value2" 127.0.0.1:6379[2]> hset hash1 key3 10 (integer) 1 127.0.0.1:6379[2]> hincrby hash1 key3 5 // 将key3的value增加15(仅限整数) (integer) 15 127.0.0.1:6379[2]> hmset hash1 key4 value4 key5 value5 // 批量添加元素 OK
其他操作
dbsize 查看所有key的数目
flushdb 删除当前选择数据库中的所有key
flushall 删除所有数据库中的所有key
save: 将数据同步保存到磁盘
bgsave: 异步保存
lastsave: 上次成功保存到磁盘的Unix时间戳
info: 查询server信息
config: 配置server
slaveof: 改变复制策略设置
publish-subscribe
redis的发布/订阅机制使用非常简便, 如下图:

subscribe chatchannel 订阅该chatchannel频道, 则会实时接收到该频道的消息;
publish chatchannel ‘hello’ 向chatchannel频道发布消息, 所有订阅者都能收到.
这种机制, 可以非常方便地使用在类似于聊天室的场景中.
redis持久化
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
RDB
RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。
redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持