Redis
Redis从入门到进阶
绅士jiejie
理想的生活,就是生活的理想!
展开
-
连接redis哨兵碰到的一些问题
连接redis哨兵碰到的一些问题原创 2024-10-13 10:48:16 · 151 阅读 · 0 评论 -
MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persis
MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persis原创 2023-06-25 21:43:12 · 277 阅读 · 0 评论 -
Centos安装Redis
Centos安装Redis原创 2023-06-18 19:42:37 · 712 阅读 · 0 评论 -
Redis安装后,客户端连接报Unable to connect to xxx:6379
Redis安装后,客户端连接报Unable to connect to xxx:6379原创 2023-06-18 20:57:50 · 2244 阅读 · 0 评论 -
内存淘汰策略和缓存过期策略
以下基于Redis来简单了解下内存淘汰策略和缓存过期策略。先聊聊缓存过期策略有哪些?定时删除这是最常见也是应用最多的策略,使用这个策略,每个设置过期时间的key都需要创建一个对应的定时器,到过期时间就立即被清除。这种方式需要耗费大量的CPU资源去处理过期数据,可能会影响到缓存服务的性能,不过它好就好在会立即把过期无用的数据删除了,避免浪费内存。惰性删除这就是个懒加载的思想,只有当一个key被访问到时,才会去判断这个key是否过期,然后决定是否要进行删除操作。CPU资源时节约了很多,但是原创 2020-10-28 12:24:43 · 399 阅读 · 0 评论 -
缓存穿透和缓存击穿有什么区别?
缓存穿透和缓存击穿是使用缓存系统必须考虑问题中的两个。这里不具体讨论解决方案,主要是想把缓存穿透和缓存击穿说清楚些,避免面试时候出现混淆。什么情况算是缓存穿透?个人理解,使用缓存就是为了减小数据库压力,让大部分的读请求都能落到缓存系统上。而只要请求穿过了缓存层,直接打到了数据库,我就把这个现象理解为缓存穿透。什么情况会引起缓存穿透?只要缓存失效了,就会出现缓存穿透,然后根据失效缓存数量的多少,划分出缓存击穿和缓存雪崩,比如热点key失效,高并发请求打到数据库,就是缓存击穿现象。比如大量key原创 2020-10-28 12:16:37 · 7734 阅读 · 2 评论 -
Redis-了解下Jedispool连接池的预热操作
一般定义Jedispool连接池创建类,代码如下:import org.springframework.context.annotation.Bean;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import java.util.ArrayList;import java.util.List;/** * .原创 2020-09-18 10:19:04 · 1277 阅读 · 0 评论 -
如何推算Jedispool连接池的最大空闲连接数maxIdle值呢?
这里要先了解下,其实maxTotal属性所表示的最大连接数,只是给出了一个连接数量的上限,而maxIdle属性所代表的最大空闲的连接数,才真正是业务可用的最大连接数。如果maxTotal和maxIdle二者不相等,就会涉及到连接的销毁与创建操作,会产生一定的开销,所以建议设置maxIdle=maxTotal,尽可能的避免由于频繁地创建和销毁连接而造成连接池性能下降,使连接池能够达到最佳性能。...原创 2020-09-17 19:19:27 · 2946 阅读 · 0 评论 -
如何推算一个Jedispool连接池的最大连接数maxTotal呢?
大致的推算方法是:业务QPS/单连接的QPS=最大连接数。举个例子假如一个Jedis命令操作时间大约是5ms,这里的5ms指的是往返,而不单单是执行命令的时间,所以单个Jedis连接的QPS大概是1000/5=200。此时假设业务QPS要求是20000,那么最大连接数=20000/200,为100。假设此时引入了redis集群,那么每个redis节点所对应的最大连接数=预估的最大连接数/节点数。不过在实际的生产场景中,还是要预留一些资源的,所以配置的maxTotal建议要比理论值大一些。.原创 2020-09-17 19:18:51 · 4449 阅读 · 5 评论 -
Redis-了解下Jedispool的参数
maxTotal:Jedispool资源池中最大的连接数,默认值为8。maxIdle:Jedispool资源池允许最大空闲的连接数,默认值为8。minIdle:Jedispool资源池确保最少空闲的连接数,默认值为0。该参数确保了线程池中有最小的空闲Jedis实例数量可供使用blockWhenExhausted:当Jedispool资源池用尽后,调用者是否要等待,默认值为true。当为true时,maxWaitMillis才会生效。maxWaitMillis:当Jedispool资源池连接用尽后,.原创 2020-09-17 19:18:02 · 2131 阅读 · 0 评论 -
Redis-了解下使用Jedis操作List类型的API
操作示例:public void operateList() { Jedis jedis = new Jedis("127.0.0.1", 6379); //测试是否链接成功,返回pong则代表链接成功 System.out.println("jedis.ping():" + jedis.ping()); //从列表左边插入元素 System.out.println("jedis.lpush(\"list\", \"1\", \"2\", \"3\"):" + je原创 2020-09-17 19:16:19 · 453 阅读 · 0 评论 -
Redis-了解下使用Jedis操作Set类型的API
操作示例:public void operateSet() { Jedis jedis = new Jedis("127.0.0.1", 6379); //测试是否链接成功,返回pong则代表链接成功 System.out.println("jedis.ping():" + jedis.ping()); //添加元素到集合 System.out.println("jedis.sadd(\"set\", \"1\", \"2\", \"3\"):" + jedis.s原创 2020-09-17 19:15:34 · 446 阅读 · 0 评论 -
Redis-了解下使用Jedis操作ZSet类型的API
操作示例:public void operateZset() { Jedis jedis = new Jedis("127.0.0.1", 6379); //测试是否链接成功,返回pong则代表链接成功 System.out.println("jedis.ping():" + jedis.ping()); //添加元素以及关联分数到集合 System.out.println("jedis.zadd(\"score\", 60, \"a\"):" + jedis.za原创 2020-09-17 19:14:58 · 2224 阅读 · 0 评论 -
Redis-了解下使用Jedis操作Hash类型的API
操作示例:public void operateHash() { Jedis jedis = new Jedis("127.0.0.1", 6379); //测试是否链接成功,返回pong则代表链接成功 System.out.println("jedis.ping():" + jedis.ping()); //设置hash的一对键值对 System.out.println("jedis.hset(\"user:01\", \"name\", \"jiejie\"):原创 2020-09-17 19:13:49 · 380 阅读 · 0 评论 -
使用redis-cli命令客户端远程连接redis数据库
参考命令:redis-cli -h host -p port -a password原创 2020-09-17 19:11:50 · 13672 阅读 · 1 评论 -
Java配置连接redis时指定到具体的数据库
参考配置属性格式如下:redis://用户名:密码@host:port/Redis库名其中用户名可以随意,比如要连接到第2个redis缓存库,具体如下:redis://jiejie:jiejie@127.0.0.1:6379/1原创 2020-09-17 19:11:24 · 2796 阅读 · 2 评论 -
Redis-配置慢查询
慢查询是什么?内部执行时间超过某个指定时限的查询,就叫做慢查询。指定时限如何设置Redis配置文件中有如下两个字段:slowlog-log-slower-than:该配置项单位是微秒,默认是10000微秒,也就是10毫秒,执行时间超过该时间的命令就是慢查询,不过慢查询只记录命令的执行时间,并不包括命令排队和网络传输时间,所以实际的命令执行时间只会大于等于慢查询时间,然后将这些慢查询加入到日志文件中。slowlog-max-len:设置日志的最大数量,默认是128条,服务器使用先进先出的方.原创 2020-09-13 11:40:27 · 572 阅读 · 0 评论 -
Redis-怎么让相关键都分配到集群中的同一个节点
为什么有时候要让相关键都分配到同一个节点?因为如果命令涉及到多个键,那么只有这些键都位于同一个节点里,Redis才能正常支持该命令。Redis是按照什么路由规则,分配键到节点的?因为Redis集群内置插槽为16384个,所以Redis会将每个键的键名的有效部分使用CRC16算法计算出散列值,然后对16384的取余。余数为多少就表示该键应该被分配到哪个节点,这样的话,每个键都可以被分配到16384个插槽中,而集群中的每个节点都会被分配一定的插槽。关键就在每个键的键名的有效部分,因为Redis是.原创 2020-09-11 23:56:59 · 2846 阅读 · 1 评论 -
Redis-集群的简单搭建
因为Redis要求每个集群最少要有3台服务器才能正常运行,所以接下来搭建一个3主3从的集群。3主3从代表着要有6个redis服务实例,这里先预设6个实例的端口为6380~6385,先创建这6个redis实例相关的配置文件redis-xxx.conf,可以先copy redis.conf文件然后重命名,新建一个redis-cluster文件夹来存放集群相关文件,最后redis-cluster文件夹中有如下6个文件:修改以上每个配置文件中的内容,参考如下:#端口改为服务实例相关的端口号,这里以6380端原创 2020-09-11 23:06:55 · 403 阅读 · 0 评论 -
Redis-简单实现发布订阅模式
发布订阅模式中有两种角色-发布者和订阅者,它们之间通过频道来做交流,订阅者订阅一个或多个频道,发布者把消息发送到指定的频道,那么所有订阅了该频道的订阅者就都会收到该消息。发布者通过以下命令发布消息到频道: PUBLISH channel message订阅者通过以下命令订阅频道:SUBSCRIBE channel [channel …]启动redis服务,分别开启3个redis-cli实例,然后一个发布者,两个订阅者,订阅者1订阅channel:1,channel:2这两个频道,订阅者2订阅c原创 2020-09-11 22:59:28 · 265 阅读 · 0 评论 -
[ERR] Node 127.0.0.1:6380 is not empty,Either the node already knows other nodes
以上是搭建redis集群出现的问题,如下:解决方法: 1. 删除每个节点对应的nodes-xxx.conf配置文件 2. 删除每个节点下的aof、rdb文件 3. 关掉redis集群各个实例的进程,重新启动再试试搭建集群,结果如下:启动成功。...原创 2020-09-11 22:52:52 · 1969 阅读 · 0 评论 -
WARNING: redis-trib.rb is not longer available!
使用 redis-trib.rb进行集群创建时,出现如下警告:这其实也不是错,不要慌,只是因为从redis5.0开始,建议使用redis-cli作为创建集群的命令,不推荐再使用redis-trib.rb来创建集群了,毕竟使用redis-trib.rb还要安装Ruby程序,比redis-cli麻烦的多。...原创 2020-09-11 22:50:55 · 1532 阅读 · 0 评论 -
(error) READONLY You can‘t write against a read only replica.
出现以上错误,表示当前redis服务是只读的,没有写权限,估计该服务是被当作从数据库使用了。解决方案:打开redis服务对应的配置文件,把其中的属性slave-read-only的值修改为no,这样就可写了。或者更快的方法是,通过redis-cli命令打开客户端模式,输入slaveof no one命令,让当前redis服务停止接收其他redis服务的同步,同时把自己升格为主数据库。...原创 2020-09-11 00:03:36 · 20038 阅读 · 10 评论 -
Redis-实现优先级队列
Redis实现队列功能,一般是使用LPUSH命令和BRPOP命令来配合完成。不过队列也有自己的优先级,如果存在多个队列,但是只有一个消费者,怎么实现消费的优先级?BRPOP的基本语法BLPOP LIST1 LIST2 .. LISTN TIMEOUT 第一个是键名,第二个是超时时间,单位是秒,如果列表为空或者超过了超时时间还没获取到新元素,就返回一个nil,否则返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。超时时间为"0",表示不限制等待的时间。原创 2020-09-10 23:53:50 · 2774 阅读 · 0 评论 -
Redis-简单的实现下任务队列功能
首先找到第一个切入口,redis的列表类型有两个命令LPUSH和RPOP,LPUSH命令可以让元素从左侧进入队列,RPOP命令可以让元素从右侧弹出。这样两个命令配合使用就形成了左边进,右边出的形式,间接实现了队列的功能。生产者通过LPUSH命令添加任务到某个键中,消费者通过RPOP命令不断从该键中取出任务。这时候问题来了,消费者怎么知道啥时有任务?消费者只能不断循环的读取键对应的队列,如果有任务就消费,没任务就等待一段时间然后再尝试获取任务消费,如此循环。但是如果其实长时间都没有任务进队列,这样的循环就是原创 2020-09-10 23:26:12 · 444 阅读 · 0 评论 -
Redis-简单直观的看下哨兵的效果
哨兵也是一个单独的redis进程,它不对外提供服务,主要是用来监控主数据库和从数据库的运行情况,然后在主数据库出现故障时,主动的把从数据库升级为主数据库,避免了人工切换的操作。先启动一个redis实例,端口为6379,作为主数据库,然后通过以下两个命令再启动两个redis服务,端口分别是6380,6381,同时把它们指定为6379端口redis服务的从数据库:redis-server /usr/local/etc/redis.conf --port 6380 --slaveof 127.0.0.1 .原创 2020-09-10 20:42:41 · 226 阅读 · 0 评论 -
Redis-简单直观的看下主从复制的效果
先通过命令redis-server /usr/local/etc/redis.conf 启动一个端口号为6379(默认端口号)的redis服务,作为主数据库,如下:再通过命令redis-server /usr/local/etc/redis.conf --port 6380 --slaveof 127.0.0.1 6379启动一个端口号为6380的redis服务,同时指定主数据库地址,如下:此时两个终端分别通过redis-cli -p 6379与redis-cli -p 6380两个命令进入redis客原创 2020-09-10 20:37:58 · 161 阅读 · 0 评论 -
Redis-使用sort命令怎么排序非数字元素
SORT命令可以对列表类型、集合类型和有序集合类型键进行排序。列表中元素是数字操作示例:元素是数字,通过sort命令列表返回了有序的结果。列表中元素是非数字操作示例:直接就报错了,看报错的结果,是无法转换成double类型,报错了。这是因为SORT命令会尝试将元素转换成双精度浮点数来做比较,字母无法转换成double类型,自然就报错了。解决方法,加上ALPHA参数操作示例:可以发现字母也能正常排序了。...原创 2020-09-09 19:36:31 · 304 阅读 · 0 评论 -
Redis-watch监控一个设置过期时间的键,键到期删除后结果如何?
操作示例:从操作示例中可以发现,watch监控一个设置了过期时间的键,这个键时间到期被删除,但是watch之后的事务还是执行了,所以key2的值为2。总结watch监控一个设置过期时间的键,键到期删除后,watch并不会认为这个键被改变,所以事务还是可以被执行。...原创 2020-09-09 19:34:46 · 591 阅读 · 0 评论 -
Redis-哪些命令会影响键的过期时间
PERSIST 命令PERSIST KEY用于移除给定 key 的过期时间,设置key永不过期。如果过期时间被成功移除,返回1,如果键不存在或者键本来就是永久的,则返回0。操作示例:3次调用PERSIST 命令,一次因为键过期时间被成功移除,所以返回了1,第二次因为键被删除了,所以返回0,第三次因为键是永久的,所以也返回0。SET命令SET key value设置指定 key 的值操作示例:可以发现使用了set命令后,键的过期时间被清除了。GETSET命令GETSE.原创 2020-09-09 19:34:14 · 852 阅读 · 0 评论 -
Redis-了解一下TTL命令的返回值
基本语法TTL keyTTL命令用来查询一个键还有多久的时间会被删除。键有设置过期时间,接着键被删除或者过期了,使用TTL命令的返回值操作示例:键没有设置过期时间,使用TTL命令的返回值操作示例:如果键有设置过期时间,当键过期或者被删除了,TTL命令返回-2,当键没有设置过期时间,表示是永久的,TTL命令返回-1。...原创 2020-09-09 19:30:54 · 19829 阅读 · 0 评论 -
Redis-列表排序加上分页
使用Sort key LIMIT offset count操作示例:原创 2020-09-09 19:29:32 · 293 阅读 · 0 评论 -
Redis-简单了解下watch命令
基本语法如下:WATCH key [key ...]Redis Watch 命令用来可以监控一个或多个键,一旦其中有一个键被修改(或删除),那么之后的事务将被打断,不会被执行。监控一个键,该键被修改操作示例:可以发现监控的键被修改后,事务没有执行,所以key的value是1。监控多个键,有一个键被修改操作示例:可以发现被监控的多个键中,其中之一的key键被修改后,事务也没有执行,所以key的value是3,key1的value依旧是1,key2的value依旧是2。监控的键被删.原创 2020-09-09 12:09:23 · 3004 阅读 · 1 评论 -
Redis出现错误时,不支持事务回滚
本次测试使用的redis版本是5.0.5,如下:错误情况一:语法错误,命令不存在或者命令参数的个数不对操作示例:可以发现出现了语法错误后,直接就返回错误了,所有的命令都不会被执行,所以key的value值还是helloworld。错误情况二:运行错误,命令执行时出现的错误,在实际执行前,Redis是发现不了这个错误的。操作示例:可以发现即使事务里的一条命令出现了运行错误,但是事务里其他的命令包括出错命令之后的命令都会被执行,因此key的value值被改为666666。总结对于语原创 2020-09-08 20:23:36 · 1075 阅读 · 0 评论 -
Redis-有序集合类型基础命令了解与实践
增加元素ZADD key score member [score member …](返回新加入到集合中的元素个数(不包含之前已经存在的元素))该命令用来向有序集合中加入一个元素和该元素对应的分数,如果该元素已经存在则会用新的分数替换旧的分数。操作示例:获得元素的分数ZSCORE key member操作示例:获得排名在某个范围的元素列表,按照分数升序排列ZRANGE key start stop [WITHSCORES]该命令会返回索引从start到stop之间的所有元素,然原创 2020-09-08 20:21:57 · 213 阅读 · 0 评论 -
Redis-集合类型基础命令了解与实践
增加元素SADD key member [member …](返回成功加入的元素数量)键不存在则新建,存在则会判断value对应的元素是否存在,存在则忽略该元素,保证元素的唯一性。操作示例:删除元素SREM key member [member …](返回删除成功的个数)操作示例:获得集合中的所有元素SMEMBERS key(结果是无序的)操作示例:判断元素是否在集合中SISMEMBER key member值存在是返回1,不存在时返回0。操作示例:对多个集合执行差集原创 2020-09-08 20:13:23 · 134 阅读 · 0 评论 -
Redis-列表类型基础命令了解与实践
向列表左端增加元素LPUSH key value [value …](返回值表示增加元素后列表的长度)操作示例:向列表右端增加元素RPUSH key value [value …](返回值表示增加元素后列表的长度)操作示例:从列表左端弹出元素LPOP key操作示例:从列表右端弹出元素RPOP key操作示例:获取列表中元素的个数LLEN key(当键不存在时,LLEN会返回0)操作示例:获得列表片段LRANGE key start stop(如果star原创 2020-09-08 20:06:11 · 223 阅读 · 0 评论 -
Redis-散列类型基础命令了解与实践
赋值HSET key field value(返回结果为1表示字段做新增操作,为0表示字段做更新操作)操作示例:取值HGET key field操作示例:同时设置多个字段的值HMSET key field value [field value …]操作示例:同时获取多个字段的值HMGET key field [field …]操作示例:获取键中所有字段和字段值HGETALL key操作示例:判断字段是否存在HEXISTS key f.原创 2020-09-07 22:25:51 · 106 阅读 · 0 评论 -
Redis-字符串类型基础命令了解与实践
赋值SET key valueGET key(当要get的key不存在时,会返回空结果)操作示例:递增数字INCR key(原子操作,当要操作的键不存在时,默认键值为0,然后每次递增1,返回递增后的结果,当键值不是整数时,Redis会提示错误)操作示例:递减数字Decr key(原子操作,可以类比INCR key,只不过是做减法)操作示例:增加指定的整数INCRBY key increment(类似INCR key命令,只是可以指定递增的参数)操作示例:.原创 2020-09-07 22:18:53 · 257 阅读 · 0 评论 -
(error) WRONGTYPE Operation against a key holding the wrong kind of value
Redis中的每一个键都有明确的数据类型,比如使用hset命令创建的键就是散列类型,然后用操作字符串的命令去操作hset命令创建的键就会报如上错误。示例:原创 2020-09-07 22:14:50 · 55524 阅读 · 4 评论