介绍
redis是一个高性能的key-value
存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
字符串String
常用操作
增/改
SET key value //存入字符串键值对
set user:name '亚索'
MSET key value [key value ...] //批量存储字符串键值对
mset user:name '亚索' user:age 12
SETNX key value //存入一个不存在的字符串键值对
sexnx user:name '亚索'
删
DEL key [key ...] //删除一个键
del user:name
查
GET key //获取一个字符串键值
get user:name
MGET key [key ...] //批量获取字符串键值
mget user:name user:age
过期时间
EXPIRE key seconds //设置一个键的过期时间(秒)
expire user:name 10 //10s 后过期
原子加减
INCR key //将key中储存的数字值加1
INCR user:age //返回13
DECR key //将key中储存的数字值减1
DECR user:age //返回12
INCRBY key increment //将key所储存的值加上increment
INCRBY user:age 10 // +10,返回22
DECRBY key decrement //将key所储存的值减去decrement
DECRBY user:age 10 // -10, 返回12
应用场景
- 单值缓存
- 对象缓存(存json,或者存多个key)
- 分布式锁(setnx key value ex time;返回1,表示设置成功;设置超时时间,防止程序意外终止,导致死锁)
- 计数器(incr)
- web集群session共享
- 分布式系统全局ID号(INCRBY id 1000; 批量生成序列号提升性能)
哈希Hash
常用操作
增/改
HSET key field value //存储一个哈希表key的键值
hset hero:1 name '亚索' //成功,返回1
hset hero:1 age 12
HSETNX key field value //存储一个不存在的哈希表key的键值
hsetnx hero:1 name '亚索' //field存在,返回0
hsetnx hero:1 name2 '盖伦' //成功,返回1
HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对
hmset hero:1 skill1 '死亡如风' skill2 '常伴吾身' skill3 '风墙'
查
HGET key field //获取哈希表key对应的field键值
hget hero:1 name
HMGET key field [field ...] //批量获取哈希表key中多个field键值
hmget hero:1 name age skill1
HLEN key //返回哈希表key中field的数量
HLEN hero:1
HGETALL key //返回哈希表key中所有的键值
HGETALL hero:1 //返回所有filed和value
删
HDEL key field [field ...] //删除哈希表key中的field键值
HDEL hero:1 skill2 //成功删除,返回1
原子加减
HINCRBY key field increment //为哈希表key中field键的值加上增量increment
HINCRBY hero:1 age 5 //增加5,返回17
应用场景
- 对象缓存(比string节省空间,消耗内存和cpu更小)
- 购物车(用户id为key,商品id为field,商品数量value)
缺点:过期功能只能用在key上,不能用在field上;Redis集群架构下不适合大规模使用
列表List
常用操作
增/改
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)
lpush list 111
lpush list 222 //list=[222, 111]
RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边)
rpush list 333 //list=[222, 111, 333]
删
LPOP key //移除并返回key列表的头元素
lpop list //返回222
RPOP key //移除并返回key列表的尾元素
rpop list //返回333
BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
查
LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
lrange list 1 3 //list = [1,2,3,4] ,返回 2,3,4
LLEN key //返回列表元素个数
常用数据结构
Stack(栈) = LPUSH + LPOP Queue(队列)= LPUSH + RPOP Blocking MQ(阻塞队列)= LPUSH + BRPOP
应用场景
- 消息按顺序排列(lpush)
- 获取最新的指定数量的消息(lrange)
集合Set
常用操作
增/改
Set常用操作
SADD key member [member ...] //往集合key中存入元素,元素存在则忽略,若key不存在则新建
sadd my_set hello //成功,返回1
sadd my_set world
查
SMEMBERS key //获取集合key中所有元素
SMEMBERS my_set //返回 hello, world
SCARD key //获取集合key的元素个数
SCARD my_set //返回2
SISMEMBER key member //判断member元素是否存在于集合key中
SISMEMBER my_set hello //在集合内,返回1,否-返回0
SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除
SRANDMEMBER my_set 2
SPOP key [count] //从集合key中选出count个元素,元素从key中删除, 3.2.0之后才支持count参数
SPOP my_set 2
删
SREM key member [member ...] //从集合key中删除元素
srem my_set one two //返回删除的元素个数,2
运算
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ..] //将交集结果存入新集合destination中
SUNION key [key ..] //并集运算
SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
应用场景
抽奖
- 参与抽奖(sadd)
- 查看参与抽奖的所有用户(smembers)
- 抽奖count名(srandmember,spop key count)
关注模型,每个人维护要给关注集合
- 共同关注,求交集(SINTER)
- 我关注的人也关注他(SISMEMBER)
- 我可能认识的人(SDIFF)
有序集合Zset
常用操作
增/改
ZADD key score member [[score member]…] //往有序集合key中加入带分值元素
zadd my_zset 1 one
zadd my_zset 2 two
ZINCRBY key increment member //为有序集合key中元素member的分值加上increment
ZINCRBY my_zset 5 one //返回增加后的score,6
查
ZSCORE key member //返回有序集合key中元素member的分值
zscore my_zset one //返回6
ZCARD key //返回有序集合key中元素个数
zcard my_zset //返回3
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
zrange my_zset 1 3 //按照分值排序,返回three,one
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素,根据score倒序
删
ZREM key member [member …] //从有序集合key中删除元素
运算
ZUNIONSTORE destkey numkeys key [key ...] //并集计算
ZINTERSTORE destkey numkeys key [key …] //交集计算
应用场景
排行榜
- 热榜(按照阅读量倒序,ZREVRANGE)
- 七日热榜(先求并集,再倒序,ZUNIONSTORE)
高级命令
keys 全量遍历键 当redis数据量比较大时,会阻塞redis主线程,性能比较差,要避免使用
scan 渐进式遍历键
SCAN cursor [MATCH pattern] [COUNT count]
scan 0 match user* 1000
cursor //hash桶的索引值
pattern //key的正则匹配
count //遍历key的数量
返回下一次遍历时的游标位置,直到返回游标为0时结束
如果在scan的过程中如果有键的变化(增加、 删除、 修改) , 那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说 scan并不能保证完整的遍历出来所有的键
总结
官方文档地址
打开心爱的redis客户端爽一下吧