
Redis
vvhaleCH
这个作者很懒,什么都没留下…
展开
-
MySQL和Redis的数据一致性
1.可以考虑canalServer去拿mysql集群主节点的binlog,再去更新,这样代码层面、dba层面修改数据都可以同步。两个线程同时想要修改db中的某行记录,然后更新Redis,竞争到行锁修改记录之后,怎么保证Redis缓存的更新顺序。T1时刻,缓存已清空,线程2做查询任务,此时发现没有Redis,就去更新了Redis,读取到的依旧是老数据。删缓存->更db->起线程sleep一定时间,再次删缓存。思路是将更新db、更新Redis的操作原子化。线程1准备清空redis,再更新db。原创 2024-12-16 00:05:45 · 146 阅读 · 0 评论 -
RocketMQ结合Redis实现消息去重
1.消费端收到消息的时候,使用Redis提供的incr,以msgID作为key(保证唯一性),value默认从1开始递增;由于消息的重复性往往是由于网络抖动造成的,所以我们一般要在自己的业务端完成消息的去重。2.当incr返回值为1的时候,设置其失效时间为2分钟,并且要注意,该消息需要被消费;在保证了rocketMQ的消息顺序性之后,还应该进行消息去重。3.当incr返回值大于1 的时候,忽略该消息。一个可用的方案就是使用Redis做缓存。原创 2024-11-10 21:06:27 · 172 阅读 · 0 评论 -
Redis分布式锁
【代码】Redis分布式锁。原创 2024-11-09 01:10:36 · 111 阅读 · 0 评论 -
Redis的常用数据类型
string扩容机制如下:当字符串长度小于 1M 时,扩容都是加倍现有的空间;如果超过 1M,扩容时一次只会多扩 1M 的空间,需要注意的是字符串最大长度为 512M。string的数据类型是简单动态字符串(simple Dynamic string)string的内部结构实现上类似Java的ArrayList。string采用预分配冗余空间的方式来减少内存的频繁分配。String:最常用的,也就是字符串。Sorted set:有序字符串集合。List:简单的字符串列表。Set:无序字符串集合。原创 2024-11-09 01:07:42 · 77 阅读 · 0 评论 -
Redis的优点
2.单线程操作,避免了频繁的上下文切换。此处的单线程只是指网络IO以及key-value的读写由一个线程完成。但持久化和集群支撑模块是多线程的。3.采用了非阻塞IO多路复用机制。也就是单个线程,通过跟踪每个IO流的状态管理多个IO流。1.纯内存操作,如今最强的key-value数据库。支持事务化、持久化。因为是直接操作内存,索引性能强,很快,并发能力也强于直接读数据库。原创 2024-11-09 01:07:07 · 148 阅读 · 0 评论 -
Redis的持久化
这种情况下,服务器在停机时将丢失最后一次冲洗后执行的写入命令,丢失的数据量取决于系统的冲洗频率。这种情况下服务器在停机时最多丢失一个命令,但这种方式会大大降低Redis服务器的性能。这种情况下服务器在停机时最多丢失一秒之内的命令,这是一种兼顾安全和性能的折中方案。记录Redis执行的写命令,Redis重启后,重新执行这些命令。4.只有当数据库中有键值对时,RDB文件中才会有该数据库的信息。也就是RDB,比较快,实际生产中常用,可能会有丢失的数据。优点是数据保存完整,但是速度会比较慢。原创 2024-11-09 01:05:37 · 165 阅读 · 0 评论 -
Redis的缺点
如果有缓存,那么就从缓存中完成查询操作了,所以一定要保证缓存中的数据和数据库中的数据是一致的。解决的方案:1.写一个接口,每次做写操作的时候,删除缓存中对应的数据。这样做耦合度高,也有可能会出现接口调用失败的情况。2.使用消息中间件。原创 2024-11-07 01:18:21 · 191 阅读 · 0 评论 -
Redis集群
1.Redis命令搭建集群指定主从关系使用cluster replicate命令。4.当数据库中的16384个槽都分配了节点时,集群处于上线状态。3.集群配置文件由Redis节点维护,不需要人工修改。2.各节点在启动节点阶段是独立的,并没有建立联系。原创 2024-11-07 00:36:55 · 184 阅读 · 0 评论 -
RedisObject
1.lru记录对象最后一次被命令程序访问的时间,占据的比特数不同的版本不同,4.0版本占24个比特,在2.6版本占22比特,4.refcount记录的是该对象被引用的次数,占4个字节。3.encoding表示对象的内部编码,占4个比特。2.type字段表示对象的类型,占4个比特。原创 2024-11-07 00:36:26 · 85 阅读 · 0 评论 -
Redis命令
6.rpoplpush <key1> <key2>指令表示从<key1>列表右边吐出一个值插入到 <key2>列表左边。5.linsert <key> before <value> <newvalue>的返回值是新的列表长度。sismember <key> <value>用于判断成员元素是否是集合的成员。sunion <key1> <key2> 返回两个集合的并集元素。8.lpop/rpop <key>取完列表中所有值后,列表移除。smembers <key> 命令可以取出该集合的所有值。原创 2024-11-06 01:04:38 · 128 阅读 · 0 评论 -
Redis事务
5.Multi组队阶段出现某个命令错误,则执行时整个队列都会取消,在执行阶段某个命令错误,则执行时错误命令不执行,其他命令顺利执行;由于串行化命令,使得Redis的事务只保证一致性和隔离性,不保证原子性和持久性。2.Redis在执行阶段某个命令报出了错误,则只有报错的命令不执行,其他命令顺利执行。1.Redis的事务保证了一致性和隔离性,但并不保证原子性和持久性是正确的说法。3.Redis在组队阶段某个命令报出了错误,则执行时整个队列都会被取消。4.Redis不支持回滚。原创 2024-11-06 01:03:47 · 107 阅读 · 0 评论 -
Redis-zset
1.zset底层的存储结构包括ziplist或skiplist,在同时满足有序集合保存的元素数量小于128个和有序集合保存的所有元素的长度小于64字节的时候使用ziplist,其他时候使用skiplist。2.Redis 使用ziplist(压缩列表)来实现zset类型时需要满足zset类型所有member的长度小于zset-max-ziplist-value。3.zset通过用户额外提供一个评分(score)的参数来为集合中的成员进行排序,并且是插入有序。原创 2024-11-06 01:03:02 · 157 阅读 · 0 评论 -
Redis-string
对于C字符串,如果要修改字符串,必须要重新分配内存,而对于SDS,由于可以记录len和free,因此解除了字符串长度和空间数组长度之间的关联,可以在此基础上进行优化:空间预分配策略(即分配内存时比实际需要的多)使得字符串长度增大时重新分配内存的概率大大减小;惰性空间释放策略使得字符串长度减小时重新分配内存的概率大大减小,所以修改字符串时内存不会重分配。SDS在C字符串的基础上加入了free和len字段。由于SDS记录了长度,可以杜绝缓冲区溢出。1.Redis中SDS(简单动态字符串)原创 2024-11-06 01:02:00 · 308 阅读 · 0 评论 -
Redis-单线程
4.Redis6.0版本引入了多线程的目的是解决Redis在网络 I/O 上的性能瓶颈。3.实现简单,底层数据结构的设计无需考虑线程安全。1.避免线程切换和竞争产生的消耗。2.避免同步机制的开销。原创 2024-11-06 01:01:13 · 266 阅读 · 0 评论