标签:后端 副本 数据集 额外 验证 而且 报错 sdi red
Redis (REmote DIctionary Server)是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列,是一个高性能的key-value数据库。
Redis与其他key-value缓存产品有以下三个特点:
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。每种数据类型有其适合的使用场景,下面具体介绍.
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
SET key value 设置指定 key 的值
GET key 获取指定 key 的值。
SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
1.会话缓存
用户登录系统后,使用Redis保存用户的Session信息,每次用户查询登录信息都直接从Redis中获取。
2.计数器
3.定时器
redis的key可以设置过期时间,我们基于此特性设置一个定时器.
4.对象
我们把对象序列化后,可以使用redis保存该对象,然后在获取对象信息的时候,反序列化value
5.分布式锁
redis提供了setnx()方法,即SET IF NOT EXIST,只有在key不存在的时候才能set成功,这就意味着同一时间多个请求只有一个请求能保存成功,这块的可以自行搜索redis的分布式锁
Redis hash 是一个键值(key=>value)对集合,即编程语言中的Map类型.
Redis hash 是一个 string 类型的 field 和 value 的映射表.
HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
HGET key field
获取存储在哈希表中指定字段的值。
HKEYS key
获取所有哈希表中的字段
HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
hash 特别适合用于存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
LPUSHX key value
将一个值插入到已存在的列表头部
LPUSH key value1 [value2]
将一个或多个值插入到列表头部
LPOP key
移出并获取列表的第一个元素
BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
1.消息队列
Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的"抢"列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
2.类目/文章/活动等列表
最常见的就是各个系统的首页数据,包括电商系统的商品类目,拼团活动列表,博客园的首页文章列表等
3.其他
根据push和pop的方式不同,有以下组合方式
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queue(消息队列)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
SADD key member1 [member2]
向集合添加一个或多个成员
SDIFF key1 [key2]
返回给定所有集合的差集
SINTER key1 [key2]
返回给定所有集合的交集
SMEMBERS key
返回集合中的所有成员
1.标签(tag)
比如在点餐评价系统中,用户给某商家评价,商家会有多个评价标签,但是不会重复的,如果100万人给某商家评价打了标签,如果使用MySQL数据库获取大数据量去重后的评价标签,会影响数据库的性能和系统的并发量.
2.相同点/异同点
利用交集、并集、差集等操作,可以计算两个人的共同喜好,全部的喜好,自己独有的喜好等功能。
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key
获取有序集合的成员数
ZREM key member [member ...]
移除有序集合中的一个或多个成员
1.排行榜
例如博客园需要对用户发表的文章做排行榜,榜单的维度可能是多个方面的:按照时间、按照点赞数、按照热度,浏览数等
Redis 提供了不同级别的持久化方式:
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化,但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快
一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能.
在一个高频访问的应用系统中,每次用户的请求需要去DB中获取数据,会对数据库造成很大的压力、容易导致数据库的奔溃。所以才会出现缓存来分担一部分的数据库的压力。 但是使用缓存也带来了一系列问题:
当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动移除对应的缓存。 所以需要通过事物机制来保证缓存的一致性。
在高并发场景下,有多个请求去共同请求一份相同的业务数据。有可能多个请求先去从缓存中获取数据、获取不到的并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。
按照实际的场景去做判断例如 1%的场景直接访问数据库,99%的可以通过缓存获取到数据。
在系统设计的的时候预期是通过缓存来减轻数据库的压力、防止数据奔溃的情况。在某个实际发生的场景中、大量的请求并没有命中缓存而导致了大量请求达到数据库、从而导致数据库有巨大冲击和压力。
在某个大促活动中有大量的热点数据,互动一开始需要访问这些数据。由于活动开始的时候洪峰流量到来,所有的请求缓存、缓存直接击穿,访问数据库导致数据库直接cpu 100%,业务系统直接奔溃。
对于这种场景可以提前对数据进行预热,开活动开始前先将数据推送到缓存中。
由于我们在缓存使用的过程中会设置缓存的失效时间、如果设置的不合理可能会导致数据集中失效的情况。由于缓存集中失效会导致系统缓存穿透、在同一时刻高并发的访问数据,造成数据雪崩。
解决这种场景的可以将失效的时间由固定值+随机值来构成。EXPIRETIME=FIXTIME+RUND_TIME 例如你想保证整个EXPIRETIME是5S 左右,可以 通过EXPIRETIME=4000+Random(1000)
通常Redis keys创建时没有设置相关过期时间,他们会一直存在,除非使用显示的命令移除,例如,使用DEL命令。
EXPIRE一类命令能关联到一个有额外内存开销的key。当key执行过期操作时,Redis会确保按照规定时间删除他们。
key的过期时间和永久有效性可以通过EXPIRE和PERSIST命令(或者其他相关命令)来进行更新或者删除过期时间。
Redis keys过期有两种方式:定期删除和惰性删除。
定时删除,用一个定时器来负责监视key,当key过期则自动删除key。
虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,会影响redis的性能.
客户端尝试访问key时,key会被发现并主动的过期. 但是这样是不够的,因为有些过期的keys,永远不会访问他们,那么他们就永远不会被删除,而占用内存,导致redis内存被过期的key占用.
redis默认每100ms检查一次,是否有过期的key,有过期key则删除。需要说明的是,redis不是每100ms将所有的key检查一次,而是随机抽取20个keys进行过期检查,同时删除已经过期的keys,如果有多于25%的keys过期,重复抽取。直到过期的keys的百分比低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys
那么问题来了,采用定期删除+惰性删除就能保证过期的key会全部删除掉么?
如果定期删除没删除key。然后也没去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。
在redis.conf中有配置
maxmemory-policy volatile-lru
内存淘汰策略如下:
标签:后端 副本 数据集 额外 验证 而且 报错 sdi red
原文地址:https://www.cnblogs.com/iceblow/p/11421547.html