Redis基础

  • Post author:
  • Post category:其他




Redis基础



数据结构

key-value



数据类型

String、set、list、hash、zset



Redis作为缓存的特点

  • 支持数据的持久化,可以将内存数据存储到硬盘,重启时,可以再次加载使用。
  • 支持key-value数据结构,且支持set、zset、list、hash等数据结构存储。
  • 支持数据备份,master-slave模式的数据备份。



Redis优势

  • 读写性能高,读速度110000次/s,写速度81000次/s
  • 丰富的数据类型:Strings、sets、lists、hashes、ordered sets
  • 原子性,要么成功,要么完全失败(单个操作、多个操作)
  • 丰富的特性,比如:发布/订阅、过期、通知等



Redis与其他key-value存储区别

  • 复杂的数据结构+原子性操作,程序员可以无需进行额外的抽象
  • 运行在内存,持久化到磁盘。所以读写操作时需要考虑硬件内存大小,相对之下优势就是在内存中可以更方便的操作比较复杂的数据结构


Redis 作用

:高速数据存储、消息管道。高速、高频操作存储、查询会使用Redis进行。将数据存入Redis,再将其放入数据库。


测试点:

  • 社交产品-列表页面查询:查询数据来源为Redis,Redis需要定期刷新缓存,尽可能提供最新数据。
  • 商品购物车操作
  • 发抢红包
  • ……


开始记概念



http://try.redis.io/


数据结构

:String、Lists、Sets、Sort Sets、Hashs


存储结构

:key_value存储



String



set

get

del

type(获取value存储类型)

incr(在vlue基础上+1,空值(del操作后)基础上操作incr,结果为1)注意:多线程+不安全,推荐incr进行操作。



Redis过期原理


set resource:lock "Redis lock"		--set resource lock
expire resource:lock 120		--set 过期时间
ttl resource:lock		--获取当前过期时间
直到过期时=>2
get resource lock		--返回nil,已过期,被销毁



Redis列表List


:一系列排序的value

RPUSH friends "Alice"		--列表最右边添加Alice
LPUSH friends "Sam"		--列表最左边添加Sam
LRANGE friends 0 -1		--输出列表所有数据
LRANGE friends 0 1		--输出列表第1、2个数据
输出的数据形式: 1) "Sam", 2) "Alice", 3) "Bob"
LPOP friends		--删除最左边的value
RPOP friends		--删除最右边的value
RPOP friends		--打印列表长度



Redis集合Sets


:无序value集合

SADD superpowers "flight"		--添加flight
smembers superpowers		--打印当前集合value
SREM superpowers "flight"		--删除该值,返回1,删除成功,返回0,删除失败
SISMEMBER superpowers "flight"		--判断当前集合是否存在该值,0-->不存在,1-->存在
SUNION superpowers birdpowers		--取superpowers集合、birdpowers集合的并集



Redis “排序”集合Sort Sets


:有序的集合

ZADD hackers 1912 "Alan Turing"			--1912作为集合内该value的排序值
ZADD hackers 1940 "Alan Kay"		--
ZADD hackers 1906 "Grace Hopper"
ZADD hackers 1953 "Richard Stallman"
ZRANGE hackers 1 2		--取第2、3个值,也就是Alan Turing、Alan Kay



Redis “哈希”集合Hashs


:可以理解为HashMap,value内再套key-value

HSET user:1000 name "John Smith"		--集合user:1000内存入name "John Smith"
HGETALL user:1000		--输出集合内容1) "name" 2) "John Smith"
HGET user:1000 name		--输出集合内key为name的value
HSET user:1000 visits 10		--还可以用于数值计算
HINCRBY user:1000 visits 1		--加1
HDEL user:1000 visits		--删除值
HINCRBY user:1000 visits 1		--nil空值+1,结果是1


Redis部署–docker



以后贴命令


是时候考验真正的技术了!


Redis一般放入哪些项目数据?频繁读取、变动不频繁

:作为测试需要有判断此处是否该用缓存的能力,提出对项目有意义的建议是测试的本职。

参考文章:

https://blog.csdn.net/qq_42809504/article/details/83003587


Redis常见应用场景

:排行榜、秒杀、订单查询、会话缓存、全页缓存、队列、发布/订阅



缓存更新机制

1.手动更新或定时更新

2.用户触发更新【考虑缓存过期时间、考虑并发写的情况,考虑读写并发的情况】

参考文章:

https://blog.csdn.net/weixin_43850799/article/details/105326371


读取数据与存储数据的流程是什么样的?

读取数据:

  • 读取Redis缓存–>缓存数据存在–>返回
  • 读取Redis缓存–>缓存数据不存在–>查询关系型数据库,数据存在–>返回–>将相关数据写入缓存
  • 读取Redis缓存–>缓存数据不存在–>查询关系型数据库,数据不存在–>返回不存在,保证用户端交互正常
  • db删除数据–>同步到缓存–>查询缓存,不存在该数据



异常测试+性能测试


  1. 同一时间大量去请求”缓存中没有“且”数据库中有”的数据
  2. 同一时间大量去请求“缓存中没有”且“数据库中也没有”的数据
  3. 同一时间大量去请求“缓存中有,但即将过期的某一个key值”的数据

验证点是,接口能否成功正常响应以及响应时间是否符合性能要求。


Redis须知两种异常场景:缓存雪崩、缓存击穿

(1)缓存雪崩

缓存雪崩是指在我们设置缓存时采用了相同的过期时间或者其他情况,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

解决方案:

1.用加锁或者队列的方式保证缓存的单线程写,从而避免失效时大量的并发请求落到底层存储系统上。

2.将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

(2)缓存击穿

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。

缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方案:

使用互斥锁(mutex key),在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。



版权声明:本文为LittleGirl_orBoy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。