首页 > 编程知识 正文

redis高并发竞争key,redis读写高并发阻塞

时间:2023-05-05 03:40:49 阅读:52774 作者:1624

简介Redis作为重要的缓存数据库在高并发性解决方案中发挥着重要的作用。 为了系统地学习Redis,为了秋季招聘,也为了美国集团对Redis的学习感兴趣,计划制作这个系列的博客,也是为了整理知识点。

本文主要介绍了Redis的基础知识和原理。 然后更新Redis分布式知识和实际使用的操作。 希望阅读这三篇文章能完全掌握Redis的使用!

NoSQL Not Only SQL的简称。 NoSQL是为了解决传统的RDBMS在应对某些问题时无能为力而提出的。 具体表现如下:

RDBMS依赖的表结构可扩展性较低,如果表较多,修改表结构的成本较高。 IO慢:已引入索引,但存在索引无效的问题; 大量数据处理乏力:由于1和2,变成了3。关系型数据库和NoSQL数据库的关系从来都不是谁取代谁,而是在一个复杂的高并发系统中相互增益,共同为系统提供可用性。

主流分支KV数据库Redis:KV主存储数据库,所有操作都位于主存储中。 定期异步持久化数据。 但是,数据库的提供性能受主存储大小的影响,主存储成本高。 列族数据库HBASE是列族数据库,传统的数据库结构没有更改,但提高了对数据分析的支持。 Cassandra是Facebook的分布式数据库。 其优点是:1)该数据库的设计模式非常灵活,不需要先设计数据库模式,添加和删除字段非常方便。 2 )支持范围查询。 可以对键进行范围查询; 3 )高扩展性:单点故障不会影响整个群集,支持线性扩展。 Hypertable :也是一个开源分布式数据库,使用bigtable。 适用于HDFS和KFS等大型分布式集群。 文档数据库

文档数据库不关心高性能读写并发,而是确保大数据的存储和卓越的查询性能。 MongoDB :介于关系数据库和非关系数据库之间,支持多种数据格式和快速访问。 couch db :支持JSON和AtomPub。 为了确保数据完整性,CouchDB符合ACID属性。 Redis概述远程目录服务器的简称。 特点是主存中存储数据主要特点是IO快,易失性,成本高

该特征如下

Redis不适合保存大文件; 不适合保存需要持久化的文件; 需要适合存储热点数据的(高速I ) o ); 适用于存储具有一定生命周期的数据。 生命周期结束后将被销毁或永久化到磁盘。 在Redis中,数据的存储有RDB和AOF两种形式。 RDB记录实际数据,AOF记录对数据的操作,Redis重写操作。 AOF效率更高,但RDB使用压缩存储,存储效率更高。

Redis数据类型Redis是KV数据库,位于所有的Key都是字符串且唯一,数据类型指的是value的类型。

redisjavastringstringhashmaplistlinkedlistsethashsetsorted _ settreesetredis可以使用16个数据库。 默认情况下使用0号数据库。 使用选择索引切换数据库。

key命名约定

key的操作1 .在基本的操作操作分散的情况下,防止存储在多个节点上的key发生冲突是重要的点。

是否要删除del key#以获取get key#模糊查询? 表示占位符的*表示任意长度任意字符的keys pattern#类型type key#自增加操作incrkeyincrementincrbyfloatkeyincrementkey是字符串,因此在操作时会转换为数字进行计算。由于Redis是单线程的优先执行命令,因此无需担心并发导致的数据完整性问题。

2 .生命周期设置redis采用主存储,因此通常存储具有一定生命周期的数据。

#生命周期expirekeysecondspexpirekeymillisecondsexpireatkeytimestamppexpireatkeymilliseconds-timestamp #生命周期TL keypt TL密钥y

keyvaluename咸鱼刺突age18操作: #添加数据获取setkeyvalue#getkey删除del key#添加多个m setkey1value1key2value2. #添加多个mgetkey1key2 如果需要在获取字符串长度的strlen key1#字符串之后添加字符串append key value Hash类型的key对应多个value,则必须使用hash结构。 相当于在string上嵌套了多个结构。 在Hash的value 中只能存储字符串上,每个键值对的存储上限为2^32 -1。

如果filed数据

较少,底层的存储结构采用数组的方式,如果较多采用HashMap的形式。

# 新增数据hset key field valuehmset key field1 value1 field2 value2...hsetnx key field value# 获取数据hget key fieldhgetall keyhkeys keyhvals key# 删除数据hedel key field1 field2....# 获取字段的数量hlen key# 判断是否存在hexists key field list类型

list是序列结构,即各个元素之间有位置上的关系。redis中的list实现是 双向链表,逻辑结构为队列。根据队列的特点,不难猜出对list的操作应该包括在双端的操作。key相当于是一个指针。

# 添加数据lpush key value1 value2rpush key value1 value2# 获取数据lrange key start stop# 获取指定位置的valuelindex key index# 获取长度llen key# 获取并移除lpop keylpop key# 规定时间内获取并移除数据blpop key1 [key2] timeoutbrpop key1 [key2] timeout# 移除指定数据lrem key count value set类型

set的定位和数学中的集合一致。set的查询效率高,且可以存大量的 数据。其存储结构和Hash结构完全 一致,但是其value的值为空。

常用来解决:

数据的快速过滤和查找;存储用户的权限等对顺序没有要求的内容。 # 添加数据sadd key member1 [member2]# 获取全部数据smembers key# 删除数据srem key member1 [member2]# 获取数据量scard key# 是否包含某个membersismember key member# 随机获取指定数量的数据srandmember key [count]# 随机获取一个数据并移除spop key# 集合运算sinter key1 [key2]sunion key1 [key2]sdiff key1 [key2]# 集合运算并保存结果sinterstore destSet key1 [key2]sunionstore destSet key1 [key2]sdiffstore destSet key1 [key2]# 将指定数据从原始集合移动到目标集合smove source dest member zset类型

是一种有序的数据结构。score就是判断的规则。sorted_set在set的基础上加入了一个score字段,按照这个字段排序。

# 添加数据zadd key score1 member1 [score2 member2]# 获取全部数据zrange key start end [withscore]zrevrange key start end [withscore]# 删除数据zrem key member# 按条件查找数据 limit指定是个数zrangebyscore key min max [withscore] [limit]zrevrangebyscore key max min [withscore] [limit]# 获取数据对应的索引zrank key memberzrevrank key member# 获取score值zscore key memberzincrby key increment memeber# 按照条件删除数据zremrangebyrank key start endzremreangebyscore key min max# 获取集合总量zcard keyzcount key min max# 集合操作:交集会将key相同的score相加zinterstore destSet numkeys key1 [key2]zunionstore destSet numkeys key1 [key2] Redis的持久化

持久化就将数据存储在本地磁盘,为了数据的恢复。通常的方式有:AOF和RDB。

RDB详解

开启RDB的指令有两种:

save指令 ,一旦执行,CPU会立刻去对数据进行持久化 ,但是由于Redis是单线程的,当数据量很大,会导致长时间的阻塞;bgsave指令,一旦执行Redis会在CPU空闲时执行持久化 操作。
RDB配置 AOF(Append Only File)

记录的是对数据的操作。读操作不用记录,修改操作记录。 AOF之所以效率高,是因为其采用指令重新写机制,将可以合并且简化得到指令重写,大大减少了文件体积。比如用户的单个插入会被整合成mset的形式。

AOF三种写策略:

always:每次发生变化就写一次,效率低

everysec:每秒将缓冲区的指令同步到缓冲区,准确率高,性能好。

no:系统控制,不建议使用。

AOF功能开启 # 开启AOFappendonly yes|no# AOF写数据策略appendfsync always|everysec|no# 日志文件名appendfilename filename# 地址dir path AOF重写

AOF重写是为了压缩AOF文件的大小。通过指令重拍和组合来减少不必要的操作。

手动重写bgrewriteaof 自动重写auto-aof-rewrite-min-size sizeauto-aof-rewrite-min-percentage percentage

AOF与RDB的比较 持久化方式RDBAOF占用空间小(数据压缩)大(指令重写)存储速度慢快恢复速度快慢资源消耗高低启动优先级低高 Redis事务 # 开始事务,之后的所有指令都是属于该事务的multi# 取消事务discard#执行事务exec

Redis锁

为了在事务过程中保持数据的操作不出错,redis中引入了锁的概念。这个锁就是设置一个string,对某个字段column设 锁就是setnx lock-column value,这个value设置的就是我们操作的数值,每个业务进入之后就对这个value进行修改。
同时还需要配合expire防止程序卡死导致锁无法释放。
注意:Redis中setnx操作是原子性操作。

# 监听keywatch key1 key2..# 取消监听unwatch Redis删除策略

Redis所占内存成本太高,要求定期移过期数据,以缓解内存的压力。有以下几种删除策略。

定时删除:设置一个定时器,对过期的数据定期清洗。虽然可以保证内存中没有过期的数据 ,但是会对CPU造成巨大压力。

惰性删除:当我们使用一个数据的时候再去判断是否过期。这样虽然减少了CPU的压力但是会造成数据的堆积,加重了内存的压力。

定期删除:让CPU定期删除是一个折中策略。通过配置信息指定定期删除的条件(是一种随机抽检的方式)。 使用较多。

Redis的逐出策略

redis在存储数据时,会先调用freeMemoryNeeded()函数检测内存是否充足。当内存已满,且无法清出足够的空间存放新的 数据就会使用数据逐出,其实这和OS中的页面交换算法思想一致。选择用处最小的数据放出。

相关配置 # 最大可用内存maxmemory# 每次选择待删除的据个数maxmemory-samples# 删除策略maxmemory-policy策略有:1. lru:最近最少使用的数据淘汰2. lfu:使用次数最少的数据淘汰3. ttl:快过期的数据淘汰4. random:随机挑选数据淘汰检测范围:5. 检测易失性数据:volatile-xxx eg:volatile-lru6. 检测全库数据:allkeys-xxx7. 放弃使用数据驱逐:no-envitction

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。