20191219 Redis工作中常用命令

Jedis类直接使用 Jedis jedis = new Jedis(“localhost”,6379);

不使用连接池。这是一个连接对象,释放资源, jedis.close();

 

Jedis连接池的使用:jedisPool的直接使用

JedisPoolConfig config = new JedisPoolConfig();

JedisPool pool = new JedisPool(config,"localhost",6379);

 

jedisPool = new JedisPool(jedisPoolConfig, properties.getProperty("host"), Integer.parseInt(properties.getProperty("port"))); 获取连接方法(静态方法获取连接) public static Jedis getJedis(){ return jedisPool.getResource(); }

 

JedisPool的使用-连接池

 

Jedis连接池

1,初始化连接比较消耗资源,为了节省资源,使用JedisPool。连接池的设计就是为了避免频繁创建连接的开销。

2,创建JedisPool对象时候、参数除了需要Redis的IP、端口之外,还需要JedisPoolConfig对象。

3,在JedisPool使用完Jedis连接对象后,尽量将Jedis对象归还给连接池,也就是调用一下Jedis的close方法。

 

使用JedisPool步骤

1,获取Jedis实例需要从JedisPool中获取;

2,用完Jedis实例需要返还给JedisPool;

3,如果Jedis在使用过程中出错,则也需要还给JedisPool;

 

JedisPool 双重锁,单例模式,保证之创建一个对象。

不关闭连接池,只释放资源即可。

 

JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

maxTotal/maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(用尽状态)。

maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;

 

连接用尽时的策略配置

whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。 [ɪɡˈzɔːstɪd]

WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;

WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;

WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;

 

什么时候触发这个条件?(获取一个连接的时候,连接用完,触发等待,设置等待时常。)

setMaxWaitMillis/maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;

 

testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;

testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());

 

创建JedisPool对象;

从Jedis连接池JedisPool获取Jedis实例;

将jedis实例归还给jedis连接池。

怀疑是不是jedis操作报错之后,连接并没有被JedisPool回收?

jedis连接用完了,然后默认给阻塞了,然后直到获得连接。肯定要回收释放资源的。

 

在使用jedispool 的时候一定要注意两点

1,在获取 jedisPool和jedis的时候加上线程同步,保证不要创建过多的jedispool 和 jedis。

2,用完Jedis实例后需要返还给JedisPool。

 

 

1,Could not return the resource to the pool;或着搜索"Object has already been returned to this pool or is invalid"

2,redis exists [B cannot be cast to java.lang.Long。

3,redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: 断开的管道 (Write failed).

 

使用JedisPool操作redis时候,JedisPool必须使用单例模式,不能每个用户创建一个实例。

Redis超时时间是有限制的,如果设置时间过长,可能会找不到key对应的value,或者报不存在。

当前jedis实例已经被回收了,但是仍然通过此实例获取数据,就会报断开的管道。

3,常用配置 

spring.redis.host=192.168.103.253
spring.redis.port=6379
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间
spring.redis.timeout=30000

 

Redis操作异常: java.lang.ClassCastException: java.lang.Long cannot be cast to [B

redis连接操作出现异常后,应该关闭close, 归还资源,重新获取一个redis连接使用。程序写的是:出了异常,记录日志,接着用这个redis连接,一直出异常。

 

在于并发多线程环境下,如果一直使用单实例Jedis,单请求/线程没问题,多线程会争抢资源,就会出现B cannot be cast to java.lang.Long等错误,还有可能产生jedis.get("xxx")获取到的居然是"OK"结果

redis的封装:

JedisConfig类 与 JedisUtils类

 

EXISTS KEY_NAME; 若 key 存在返回 1 ,否则返回 0 。 是否存在。

 

Redis DEL命令用于删除已存在的键。不存在的 key 会被忽略。

DEL命令的返回值:

1)如果删除成功,返回值是被删除 key 的数量。

2)如果删除的键不存在,返回值为0;

Redis decr命令

Redis Keys 命令用于查找所有符合给定模式 pattern 的 key

返回值:符合给定模式的 key 列表 (Array)。

keys *app 查询所有的键中,以app结尾的key的数组。

 

Redis中的SortedSet存储类型

min和max表示的范围是闭区间范围,即min <= score <= max内的成员将被返回。闭区间。

ZADD key score member如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。

从小到大进行排序。反过来就是从大到小排序。

Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。

尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。

订单过期使用sortedset这种数据结构。

Set<String> set = cacheClient.zrevrange("cache-user-score", 0, 10);

 

 

常用redis命令:一定要会敲命令才行。 每个命令的使用场景是什么?什么时机使用。

1、设置一个键的值 SET key value

2、获取一个建的值 GET key

3、删除键对 DEL key

4、返回一个Key所对应的值的类型TYPE key。redis的五种数据类型。

5、检查key是否存在 EXISTS key。若 key 存在返回 1 ,否则返回 0。

6、搜索某关键字: KSYS *4,星号表示通配符。KEYS pattern 查找所有符合给定模式的key.

7、必须将值存储到相同的哈希槽。

CROSSSLOT Keys in request don't hash to the same slot。

因为值不在同一个哈希槽中。可以通过命令查看在哪个哈希槽中? CLUSTER KEYSLOT key

cluster keyslot key。 同一个结点的哈希槽上。

使用Hash Tags强制所有的key属于一个节点。

为了实现将key分到相同机器,就需要相同的hash值,即相同的key. 关于哈希槽和密钥还是不太懂啊。

 

8、EXPIRE key seconds 为key设置过期时间。

CLIENT LIST 获取连接到服务器的客户端连接列表。客户端连接列表。

CLUSTER SLOTS 获取集群节点的映射数组;

INFO 获取 Redis 服务器的各种信息和统计数值;

MONITOR 实时打印出 Redis 服务器接收到的命令,调试用;

ROLE 返回主从实例所属的角色;Redis Role 命令查看主从实例所属的角色,角色有master, slave, sentinel。 当前结点是主节点还是从结点;如果是从结点,它的主节点是谁?

SAVE 同步保存数据到硬盘;

 

Redis Client Slots 命令用于当前的集群状态,以数组形式展示。

显示哈希槽和Redis实例映射关系。使用这个命令可以获得哈希槽与节点(由IP和端口组成)的映射关系。(结点一般使用ip地址和端口号表示)

这样,当客户端收到(用户的)调用命令时,可以根据(这个命令)返回的信息将命令发送到正确的Redis实例. (将命令发送到指定的redis实例)

每一个(节点)信息: 哈希槽起始编号,哈希槽结束编号.

(每个节点信息的)第三个(行)对象一定是IP/Port形式的master节点。之后的所有IP/Port都是该哈希槽范围的Redis副本。

 

主结点---->从结点

192.168.110.84:6378-----> 192.168.110.87:6378

192.168.110.85:6378-----> 192.168.110.89:6378

192.168.110.86:6378-----> 192.168.110.92:6378

 

哈希槽对应master节点,节点使用IP/Port表示。master节点的第一个副本。

副本可以理解为从结点。

集群的每个主节点负责一部分hash槽。

 

描述每个哈希槽范围的包含嵌套对象的列表,嵌套对象包含 IP/Port。

 

redis slot 槽点

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对16384求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

 

现有一个key要insert到Redis,那么根据 CRC16(key) mod 16384的值,比如得到3000,那就把这个key保存在A服务器里面了。读的时候也一样,有个key要去读,就先 CRC16(key) mod 16384 找到对应的slot,然后就去对应的服务器找数据。看起来,很像个索引吧。

 

使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;

当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;

在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值