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

 

lpush key value [value ...]   //将一个或多个值 value 插入到列表 key 的表头
rpush key value [value ...]
lpop key
rpop key
lrange key start stop
blpop key [key ...] timeout
brpop key [key ...] timeout
 
  • 常用数据结构
Stack(栈) = lpush + lpop -FILO
Queue(队列) = lpush + rpop
Blocking MQ(阻塞队列) = lpush + brpop
  • 应用场景:
微博和微信公众号的消息流:适合于粉丝量小的情况。redis单机qps将近10万
zhangsan关注importJava、36kr等大v
1)importJava发微博,消息id为1001
lpush msg:{zhangsan:id} 1001
2) 36kr发微博,消息id为1002
lpush msg:{zhangsan:id} 1002
3)查看最新微博消息
lrange msg:{zhangsan:id} 0 5

Set

相当于java中的hashSet,键值对是无序的唯一的。

常用操作

sadd key value

smembers key  #顺序与插入可能不一致,无序的

sismember key  value  查询某个value是否存在

scard key  获取长度,count()

spop key   弹出元素(先进先出)

运算操作

sinter key [key ...]   //交集运算
sinterstore destination key [key ...]   //将交集结果存入新集合destination
sunion key [key ...]   //并集运算
sunionstore destination key [key ...] 
sdiff key [key ...]   //差集   别的集合中有而该集合(最后一个key)中没有的元素

应用

微信抽奖小程序

1)点击参与抽奖加入集合
sadd key {userid}
2)查看参与抽奖的所有用户
smembers key
3)抽取count名中奖者
srandmember key [count]  /   spop key [count]

微信微博点赞、收藏、标签

1)点赞
sadd like:{消息id} {用户id}
2)取消点赞
srem  like:{消息id} {用户id}
3)检查用户是否点赞过
sismember  like:{消息id} {用户id}
4)获取用户点赞列表
smembers like:{消息id}
5)获取点赞用户数
scard  like:{消息id}
 

集合操作实现微博微信关注模型

1)zhangsan关注的人:
zhangsanSet ->{lisi,wangwu,zhaoliu}
2)lisi关注的人:
lisiSet ->{zhaoliu,qianqi,sunba}
3)zhaoliu关注的人:
zhaoliuSet->{wangwu,qianqi,sunba,zhoujiu}
4) zhangsan 和 lisi 共同关注的人
sinter zhangsanSet lisiSet  --> {zhaoliu}
5)zhangsan 关注的人也关注了他(lisi)
sismember zhaoliuSet lisi
sismember qianqiSet lisi
6)zhangsan 可能认识的人
sdiff lisiSet  zhaoliuSet zhangsanSet  -->{qianqi,sunba,zhoujiu}
 

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

  • 集合操作
ZUNIONSTORE destkey numkeys key  [key ...]  //并集计算
ZINTERSTORE destkey numkeys key  [key ...]  //交集计算
应用
  • 实现微博排行榜
1)点击新闻
zincrby hotnews:20200221 1 武汉加油
2)展示当日排行前十
zrevrank hotnews:20200221 0 9 withscores
3) 七日搜索榜单计算
ZUNIONSTORE hotnews:20200221-20200227 7
hotnews:20200222 hotnews:20200223 ... hotnews:20200227
4)展示七日排行前十
zrevrange hotnews:20200221-20200227 0 9 withscores
 

 其他高级命令

 keys 

全量遍历键。列出所有满足正则表达式和键,不建议使用

keys 正则表达式

scan

渐进式遍历键。类似于分页查找,redis存储的是hash表,乱序,返回的游标不是有序增长的,最终拿到的游标是0表示已遍历完整个数据集。

scan cursor游标 match key正则表达式 count limitint

info 

查看服务器运行情况

 

posted @ 2020-04-08 23:04  hy叶子  阅读(201)  评论(0编辑  收藏  举报