redis笔记-基础数据结构
String
i am a string |
- 单值缓存
set key value
get key
mset key value key value key value 批量插入
mget key,key 批量获取
exist key
del key
expire key second 设置超时时间
setex key second value 相当于set + expire
setnx key value 如果key不存在,就设置;如果存在就不设置
- 对象缓存
1) set user:1 value(json 数据格式)
2)mset user:1:name zhangsan user:1:grade 100
mget user:1:name user:1:grade
id | name | grade |
1 | zhangsan | 100 |
- 分布式锁
setnx product:1001 value //返回1表示取锁成功,返回0表示取锁失败
//执行业务操作
del product:1001 //释放锁
set prduct:1001 true ex 10 nx //防止程序意外终止导致死锁
- 计数器 公众号文章阅读数
incr article:readcount:文章id
get article:readcount:文章id
原子计数器:incr key 。redis是单线程,可以使用原子计数器实现分布式锁:
client1 incr lock 返回1
client2 incr lock 返回2
client3 incr lock 返回3
谁获取到的结果为1代表谁拿到了锁,可以做业务操作,结束后再decr lock,把数据减1,这样其他的客户端可以再去获取了。
- Web集群session共享
spring session + redis 实现session共享
- 分布式系统全局序列号
incrby orderid 1000 //redis批量生成序列号提高性能
hash
field1 | value1 |
field2 | value2 |
相当于java的hashMap,数组+链表二维结构,第一维hash的数组位置发生碰撞时,将碰撞的元素使用链表串接起来。但一般redis会进行rehash.
- hash常用操作
hset key field value //存储一个哈希表key的键值
hsetnx key field value //存储一个不存在的哈希表key的键值
hmset key field value [field value ...] //一个哈希表key中存储多个键值对
hget key field //获取哈希表key对应的field键值
hmget key field [field ...] //批量获取哈希表key中多个field键值
hdel key field [field ...] //删除哈希表key中field键值
hlen key //返回哈希表key中field的数量
hgetall key //返回哈希表key中所有键值
hincrby key field increment //为哈希表key中field键的值加上增量increment
- 对象缓存:
hmset user {userId}:name zhangsan {userId}:grade 100
hmset user:1:name zhangsan user:1:grade 100
hmget user:1:name user:1:grade
- 电商购物车
以用户Id为key,商品id为field,商品数量为value
添加商品-> hset cart:1001 1008 1
增加数量 -> hincrby cart:1001 1008 1
商品总数-> hlen cart:1001
删除商品 -> hdel cart:1001 1008
获取购物车的所有商品 -> hgetall cart:1001
- 优点
1) 同类数据归类整合存储,方便数据管理
2)相比String 操消耗内存比cpu更小
3)相比string存储更节省空间
- 缺点
1)过期功能不能使用在field上,只能使用在key上
2)redis集群架构下不适合大规模使用。原因:redis是根据key进行数据分片的,hash不适合于做大规模的应用,可能会造成分片不均匀。
List
相当于java中的linkedList,是链表而不是数组。插入和删除复杂度为o(1),索引定位为o(n)。
常用于做异步队列使用,将需要延后处理的数据序列化成字符串存入redis列表中,另一个线程从列表中轮询数据进行处理。
- 常用操作
a | b | c |
- 常用数据结构
- 应用场景:
Set
相当于java中的hashSet,键值对是无序的唯一的。
常用操作
sadd key value
smembers key #顺序与插入可能不一致,无序的
sismember key value 查询某个value是否存在
scard key 获取长度,count()
spop key 弹出元素(先进先出)
运算操作
应用
微信抽奖小程序
微信微博点赞、收藏、标签
集合操作实现微博微信关注模型
zset
类似于java的sortedSet和hashMap的结合体,set保证了内部value的唯一性,又可以为value赋予一个score,表示权重。
- 常用操作
zadd key score value
zrange key 0 -1 按score升序列出
zrevrange key 0 -1 按score降序列出
zcard key 相当于count()
zscore key value 获取指定value的score
zrank key value 获取value的排名,从0开始
zrangebyscore key 0 n 根据分值区间0-n遍历zset
zrangebyscore key -inf n withscores 根据分值区间(-无穷,n] 遍历zset,同时返回分值
zrem key value 删除value
- 集合操作
- 实现微博排行榜
其他高级命令
keys
全量遍历键。列出所有满足正则表达式和键,不建议使用
keys 正则表达式
scan
渐进式遍历键。类似于分页查找,redis存储的是hash表,乱序,返回的游标不是有序增长的,最终拿到的游标是0表示已遍历完整个数据集。
scan cursor游标 match key正则表达式 count limitint
info
查看服务器运行情况