
Redis
服务端开发
这个作者很懒,什么都没留下…
展开
-
Redis的5种数据类型与编码结构分析
概述Redis作为一个分布式缓存实现,相对于Memecache,除了支持持久化之外,一个重要的特性是Redis支持丰富的数据类型,即Memecache只支持字符串类型,所有键值对都是字符串类型,而Redis的值支持字符串,列表,字典,集合,有序集合五种类型,故可以提供更加丰富的操作。Redis的每种数据类型都支持多种底层数据结构实现,即每种数据类型并不是绑定为一种数据结构的,而是可以多种。这...原创 2019-03-07 14:56:00 · 3878 阅读 · 0 评论 -
有序集合zset的内部数据结构分析
有序集合zset在内部可以使用压缩列表ziplist或者跳跃表skiplist来实现。压缩列表如果使用压缩列表ziplist来实现,则键和分值紧凑相邻保存在压缩列表中,同时分值小的排在列表前面,分值大的排在列表后面。使用压缩列表ziplist来保存需要满足以下两个条件,否则使用跳跃表skiplist:集合元素少于128个;集合每个元素的键和分值都少于64个字节;即在集合元素较...原创 2019-03-04 18:10:39 · 5199 阅读 · 0 评论 -
Redis单线程与慢查询
单线程对于每个Redis实例,在内部是使用单线程来处理所有命令请求的,即所有命令在该线程中排队执行。同时需要注意的是单个Redis实例的16个数据库的操作也都是共享这个单线程的,所以在设计时,如果16个数据库或者多个都要存放数据并且读写较频繁,则推荐采用独立的Redis实例来保存各个数据库的数据,即使用不同的端口来启动多个Redis实例,每个使用0号数据库。单线程的实现基础Redis实...原创 2019-02-26 13:19:31 · 3934 阅读 · 0 评论 -
Redis性能优化:scan命令替换keys命令的用法和原理解析
keys命令keys命令用于返回指定的正则表达式所匹配的所有key的列表,其所检索的是Redis当前所使用的数据库(默认为0号数据库)的所有key,用法如下:1. *匹配数据库中所有key KEYS *2. ?匹配某个字符KEYS t?st3. *和其他字符一起使用,如下匹配test, teest等KEYS t*st4. []匹配某些字符中的一个,如下匹配test或tastK...原创 2019-02-26 12:06:21 · 12706 阅读 · 1 评论 -
Redis性能优化:多库结构改为多实例结构
Redis多库特性Redis每个实例提供了16个数据库,在使用时如果不指定数据库索引,默认使用0号数据库。可以在命令行使用:select 1,来切换到1号数据库,其中数据库索引范围为0到15。在使用方面,可以使用同一个Redis实例的不同数据库来存放不同的数据,但是如果各个数据库的读写都非常繁忙,则可能引起性能问题。具体以下分析:Redis单线程特性由于Redis单线程特性,运行过程中只使用...原创 2019-02-26 10:40:42 · 4540 阅读 · 0 评论 -
Redis持久化-RDB与AOF
一、概述Redis是一个高性能的内存数据库,也是NoSQL数据库的一种实现,与memcache一样能够提供高性能的数据存取操作,常用作分布式缓存,解决数据库在高并发访问时的性能问题。Redis与memcache相比,其中一个很大的特性是Redis提供数据持久化,即可以将内存中的数据保存到磁盘上,从而保证数据在出现如断电或进程崩溃时,不丢失。所以在实际运用中,在既需要保证数据安全性,又要...原创 2018-10-14 15:46:00 · 1711 阅读 · 3 评论 -
Redis复制:主从同步
一、概述 在高并发服务当中,如果使用单个Redis实例,由于Redis采用单进程单线程处理所有请求的方式,即每次只有一个请求在处理,后面的请求排队,如果前面请求执行时间长了,则会影响后面所有请求。所以可以拓展到多个Redis实例,采用主从机制,一个master和多个slave,master和多个slave包含相同的数据,master负责处理写请求,slave负责读请求。Redis主从同步...原创 2018-10-14 22:03:00 · 3207 阅读 · 0 评论 -
Redis复制:部分同步PSYNC详解
概述在Redis2.8之前,如果从服务器在主从复制的过程中,出现了断线,重连之后需要全量同步一次主服务器上面的数据,即从服务器发送SYNC命令给主服务器,请求进行全量同步,但是断线重连之后,从服务器只是可能落后主服务器断线期间的写入或者如果断线时间非常短,主从之间数据还是一致的,故如果简单地进行全量同步,则会造成主从服务器之间CPU,内存,网络带宽方面的浪费。故在Redis2.8及其之后版本...原创 2019-03-07 11:14:34 · 4270 阅读 · 0 评论 -
Sentinel哨兵机制实现Redis的高可用
概述Sentinel哨兵机制是Redis的高可用的解决方案,如名字一样,该机制就像一个哨兵一样,时刻监视着主从节点的运行状态,当主节点出现故障导致不可用时,自动从从节点中选举一个数据完整,状态良好的节点作为新的主节点提供服务,实现主节点的高可用。在实现层面,sentinel也是以Redis服务器的方式运行,可以发生和接收命令,只是不支持数据操作相关的命令,如可以发生INFO,PUBLISH,...原创 2019-03-06 17:07:19 · 3472 阅读 · 0 评论 -
Redis集群的设计与使用
概述Redis集群是Redis实现分布式数据库的解决方案,通过数据分片将一个完整数据库的数据分散到集群中的各个节点,即整个集群构成一个完整的数据库,集群中各个节点负责处理其中一部分数据。这样可以通过增加集群节点的方式来支持存储更多的数据,解决单机模式的Redis在存储海量数据时的瓶颈和性能问题。Redis集群是在Redis的基础上实现的集群,即对于集群的每个节点分为两层:集群层+Redis层...原创 2019-03-07 00:44:06 · 3314 阅读 · 0 评论 -
Redis的事务机制与ACID特性分析
事务命令队列客户端使用一个FIFO队列保存开启事务,未提交期间的所有命令,提交事务将这些命令一起有序地发送给服务端执行。核心命令:WATCH,MULTI(开启事务),EXEC(提交事务),DISCARD。WATCH为监视某个key的修改,如果在事务期间,其他事务修改了这个key,则整个事务提交失败,实现了乐观锁的特性。事务提交,命令提交如果是命令语法错误,如GET后面不带任何key,...原创 2019-03-09 10:30:47 · 3200 阅读 · 0 评论 -
Redis命令的原子执行:Lua脚本的支持
Redis2.6版本引入对Lua脚本的支持,可以在Redis客户端使用Lua脚本,直接在服务端原子地执行多个Redis命令。执行命令为:EVAL或者EVALSHA,如下:127.0.0.1:6379> EVAL "return redis.call('DBSIZE')" 0(integer) 94716lua脚本相关的其他命令:SCRIPT FLUSH/EXISTS/L...原创 2019-03-09 10:36:15 · 3675 阅读 · 0 评论 -
Redis队列(一):基于列表的消息队列的使用
概述在使用层面,Redis提供了用于存放字符串数据的列表这种数据类型,在数据存储容量方面,列表最多可以存放2的32次方减一个字符串元素,即大概40亿左右,不过一般不要存放这么多,否则由于数据是存放在内存中的,可能会撑爆内存。在内部数据结构实现层面,列表主要是基于链表实现的,字符串数据按照插入顺序在链表中排序,其中插入方式可以在链表前面和后面插入。除此之外,Redis还提供了列表的阻塞读取BL...原创 2019-06-08 18:09:20 · 5018 阅读 · 0 评论 -
Redis队列(二):消息的发布与订阅PubSub的使用
一、概述消息发布订阅模式在之前的文章中介绍了使用Redis列表这种数据类型来实现一个轻量级的消息队列,不过使用列表实现的消息队列存在一个缺陷就是由于是基于列表实现,所以消息出队列之后则不再存在,所以只能被一个消费者消费一次,不支持多个不同的消费者各消费一次,即不支持消息广播。为了实现消息队列常见的消息发布订阅PubSub模式,在Redis中提供了消息的发布与订阅实现,即消息生产者客户端可以...原创 2019-06-08 23:32:05 · 4274 阅读 · 0 评论 -
Redis队列(三):消息的发布与订阅的C源码实现分析
一、概述在之前的文章分析过,Redis的消息发布与订阅支持基于频道channel的精确订阅与基于模式pattern的模糊订阅,并且是实时的消息传输,不会进行消息存储,如下从源代码来分析Redis的订阅与发布功能的实现,主要在Redis源码的pubsub.c文件定义。二、消息订阅1. 客户端和服务端的订阅存储结构消息订阅主要从客户端client和服务端server两个角度来分析。首先...原创 2019-06-09 00:49:54 · 6835 阅读 · 0 评论 -
RedisTemplate序列化StringRedisSerializer只能支持String的坑
项目使用了spring-data-redis包的RedisTemplate类进行redis操作,在配置value的序列化类使用了StringRedisSerializer,如下:private RedisTemplate<String, Object> buildRedisTemplate(JedisConnectionFactory connectionFactory) { ...原创 2018-12-30 23:56:14 · 32934 阅读 · 4 评论