redis使用过程中遇到的问题及解决方法
阅读原文时间:2021年04月20日阅读:1

redis使用过程中遇到的问题及解决方法

最近项目里想用redis提升查询效率,我是其中几个模块的开发人员,在使用redis的过程中遇到了很多的问题。摸着石头过河,受到很多打击,但也学会了很多,记录下来,供自己备忘也方便别人。

1、查询key值查不到,然而用可视化工具查是有值的

仔细看了下工程中的配置文件,缓存值是A工程中放的,在B中取。A中database参数设置了0,B中database设置了1,节点不一样导致取不到值。

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="poolConfig" ref="jedisPoolConfig"/>
    <property name="hostName" value="${redis.host}"/>
    <property name="port" value="${redis.port}"/>
    <property name="password" value="${redis.pasaword}"/>
    <property name="database" value="${redis.db.index}"/>
</bean>

redis.db.index=1

Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。每个数据库对外都是以一个从0开始的递增数字命名,Redis默认支持16个数据库,可以通过配置参数databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

redis>SELECT 1
OK
redis [1]>GET foo
(nil)

2、key值过长

由于项目里面的redis是单机的,对空间的使用很关注,key值不宜过长。当数据量很大时,key值也是不小的开销。
举个例子:在一个32位的Redis服务器上,如果储存一百万个键,每个值的长度是32-character,那么在使用6-character长度键名时,将会消耗大约96MB的空间,但是如果使用12-character长度的键名时,空间消耗则会提升至111MB左右。随着键的增多,15%的额外开销将产生重大的影响。

3、不使用keys指令

由于redis是单线程的,用keys指令对系统是不小的负担,当数据量大时,会阻塞系统数秒之久。redis 2.8.0提供了scan sscan hscan zscan等命令用于查询key,具体用法参考http://doc.redisfans.com/key/scan.html
需要注意的是当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。

和 KEYS 命令一样, 增量式迭代命令也可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH 参数来实现。

4、lrange指令查全部

LRANGE key start stop
stop可以为负数,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
lrange keyname 0 -1查全部