Redis深度历险-基础应用

Redis基础应用

Posted by Claire on November 10, 2020

Redis基础应用

一、redis能做什么?

  1. 记录帖子点赞数、评论数、点击数
  2. 记录用户的帖子ID列表,用户快速展示
  3. 记录帖子的标题、摘要、作者和封面信息,用于展示
  4. 记录帖子的点击用户ID、评论ID,用户显示和去重
  5. 缓存几千里热帖内容,减少数据库压力
  6. 记录帖子相关文章ID,根据内容推荐相关帖子
  7. 如果帖子ID是整数自增的,可以用来分配帖子ID
  8. 收藏集和帖子之间的关系
  9. 记录热榜帖子ID、总榜、分类热榜
  10. 缓存用户历史行为,过滤恶意行为

二、Redis有哪些数据结构

  • String 字符串
  • list 列表
  • hash 字典
  • set 集合
  • zset 有序集合

1. String 字符串

  • 能够用于存储用户信息
  • redis的字符串是动态字符串,能够修改,内部结构类似于arraylist,采用预分配冗余空间的方式是减少内存的频繁分配
  • 字符串小于1M,扩容都是现有容量翻倍扩量,如果字符串大于1M,扩容只递增1M
  • 字符串最大长度512M
set key value
get key
mget key1 key2 key3
mset key1 value1 key2 value2 key3 value3
expire key1 5  #key1 5秒后过期

setex key1 5 sssss  # 相当于set+expire 过期

setnx key1 value1 #如果key1不存在就设置value1

value值是整数的话,可以执行自增
set key1 55

incr key1 #+1
incr key1 5 #60
incr key1 -5 #55

递增不饿能唱超过Long.MAX_VALUE

2.list 列表

  • 相当于JAVA数据类型:LinkedList,链表结构不是数组结构,因而list数据类型删除和新增很快(O(1)),但是索引定位比较慢(O(n)),列表中的值都有向前向后指针,支持向前向后遍历

  • 常用来做异步队列使用(队列,先进先出保证确保元素的访问顺序,栈,后进先出,与队列相反)

rpush key1 value1 value2 value3

llen key1 #队列

lpop key1 #队列

rpop key1 #栈

lindex keys 1 #链表get(index)

ltrim key1 start end

lrange key1 start end 
  • 底层使用quicklist实现类linkedlist的结构,在元素较少的情况,会使用连续的内存存储,结构是ziplist-压缩列表。数据较多的时候,才改成quicklist,使用链表和ziplist整合起来,将多个ziplist使用双向指针串联,既满足快速插入删除性能,又不会出现太大的空间冗余

3.Hash 字典

  • 类似于HashMap,是无序字典,存储键值对,数组+链表的数据结构。redis只能存储字符串,并且rehash逻辑不同,采用渐进式rehash策略,追求高性能,避免阻塞服务。渐进式rehash会同时保留新旧两个hash的结构,读取数据会同时分发到新旧hash上,在后续的定时任务以及hash操作指令中,循序渐进地将旧的hash内容一点点迁移到新的hash结构中,才会使用新的hash取代旧的hash
  • 可以用于存储用户信息,可以存储在一起,或者按照属性值存储,按属性读取
hget book key
hset book key value
hgetall book
hlen book 
hset book key value1
hmset book key1 value2 key2 value3
#针对整形的value能够进行递增

hset book price1 20
hincrby book price1 5 #增加5元

4.set集合

  • 类似于HashSet,内部键值对是无序唯一的,特殊的HashMap,值为NULL
  • 可用于存储某活动中中奖的用户ID,因为hash的key自带去重功能
sadd key1 value1
sadd key1 value2 value3
smembers key1  #展示结果无序
sismember key1 value4 #类似于contains功能,用于判断值是否存在
scard key1 #类似于count

5.zset 有序列表

  • 类似于SortedSet HashMap的结合,使用元素的score值,能够对列表进行排序,并且值是唯一的,内部采用跳跃表进行实现
  • 可以用于存储粉丝列表,或者带权重类型排序,可以score对应时间或者贡献值
zadd book 10.0 "aaa"
zadd book 8.8 "bbb"
zrange book fromindex toindex #获取范围内的书籍,按照score排序输出
zrevrange book fromindex toindex #逆序获取范围内的书籍
zcard book #类似于count
zscore book "aaa" #获取aaa书籍的权重
zrank book "bbb" #获取"bbb"书籍的排名
zrankbyscore book  -inf 9.0 withscores #获取负无穷~9.0区间内的书籍,附带分数
zem book "aaa" #删除

其他

  • 所有的数据结构都可以设置过期时间
  • 过期是针对对象的,是一个HASH对象对其,而不是某一个子key
  • 一个字符串对象,如果已经设置了过期时间,期间又通过set对内容进行更新了,过期机制就会失效

三、分布式锁