Redis
概述
- Redis 单线程
- 数据类型:string 、hash (map) 、list 、set 、zset
安装
- Windows
- 安装1
- 使用
- Windows + R --> 打开运营窗口
- cd … 到安装目录
- 启动服务端
- redis-server.exe redis.windows.conf
- 异常提示
- Creating Server TCP listening socket *:6379: bind: No error 端口号被占用,服务可能已经启动过了
- 连接客户端
- redis-cli.exe -p 6379 -h 127.0.0.1 -a 123456
- p:端口号 h:连接地址 a:认证秘钥
管理工具
- 工具:redis-desktop-manager2
- 使用:
- 命令窗口:选择database 右键 Console
命令3
类型 | 命令 | 含义 |
---|---|---|
system | set db_number 1 | 设置默认存储数据的database |
system | get db_number | 查询dababase |
system | select 1 | 切换database |
string | keys * | 模糊匹配KEY值 |
hash | hgetall key | 获取KEY中的Field及Value |
hash | hlen myhash | 查询 Redis KEY 中 Field 的个数 |
list4 | lpush key value | 队列左侧(队首)添加value |
list | rpush key value | 队列右侧(队尾)添加value |
list | lrange key 0 -1 | 输出队列内容 |
list | lpop key | 队列左侧(队首)移除一个元素 |
list | lpop key | 队列右侧(队尾)移除一个元素 |
其他
-
项目:页面添加检索功能,不使用数据like,频繁操作数据库;使用Redis的Hscan功能
- 存储:做DEMO验证功能时,通过CMD打开客户端,将Key 或 Field 设置为中文,CMD中都会将中文转译为相应的字符表示格式,而不是对应的中文内容;使用管理工具的Console命令即可正常存放中文
- 命令:hscan redis_key 0 match regex
- 0 游标,从第几行开始检索
- regex 匹配正则表达式
-
异常:Java Web 项目配置Redis ,启动时提示 Could not get a resource from the pool
- 原因:检查安装 Redis 时是否设置了密码;修改 Java Web 项目中相关配置文件是否有遗漏,程序运行时加载 application.properties ,是否只修改了 test-application.properties
-
异常:Java Web 项目配置Redis ,启动时提示 Constructor threw exception; nested exception is java.lang.StringIndexOutOfBoundsException: String index out of range: -1
- 原因:application.properties 中配置 redis.host = 127.0.0.1 没有配置端口号,所以报错
- 修正:redis.host = 127.0.0.1:6379
-
大坑:hscan redis_key cursor match “regex” 使用 hscan 检索 hash 结果的Redis数据中的Key值,测试 DEMO 完全正常,但实际提测过程中出现检索不到的情况
- 描述:cursor 是游标 ,使用该命令检索,每次只返回固定条数的数据,不是全部 Redis 数据检索,而是当页的数据;
- 修正:hscan redis_key cursor count max_count match “regex” 使用 count 指定该页面的数据数量,max_count 即设置为 hlen redis_key ,数据检索正常
- COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素
SCAN----Redis检索键值对
Redis命令:scan实现模糊查询
redis使用过程中遇到的问题及解决方法
-
问题:Java 操作 Hset 返回 0 ,此处的0不是表示当前操作不成功,而是 field 已存在
-
存放 Map 时,如果不能找到有效 seHash 方法,直接使用 set 方法,value 为 Map.class
批量写入
- Jedis pipeline
- pipeline.asyn() 同步返回结果
检索
- keys * 建议禁止使用
- keys *进行模糊匹配引发Redis锁,造成Redis锁住
- 会导致原本应该请求Redis的请求直接请求数据库,导致数据库负载短时间内急剧升高
- 事故示例4
使用规范5
1.冷热数据分离,不要将所有数据全部都放到Redis中
按需配置而不是将所有DB查询都放入Redis,要判断是否有必须要这样去做
2.不同的业务数据要分开存储
3.存储的Key一定要设置超时时间
禁止一律设置过滤时间0,永不过期,很多时候怕麻烦或不好设置过期时间直接永久过期而忘记清理,浪费存储空间
4.线上Redis禁止使用Keys正则匹配操作
5.谨慎全量操作Hash、Set等集合结构
禁止 hgetall 操作
6.key 值命名长度不宜过长
危险命令6
- keys
- flushdb
- flushall
- config
放入缓存中的对象,类需要实现序列化
- java.lang.IllegalArgumentException: 设定缓存的对象:BO无法序列化,确保 implements Serializable