Redis

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

  1. windows下redis安装 ↩︎

  2. redis桌面管理工具 redis-desktop-manager使用指南 ↩︎

  3. Redis笔记二之Redis命令操作简介及五种value数据类型 ↩︎

  4. Redis基本操作——List ↩︎ ↩︎

  5. Redis 的 KEYS 命令引起 RDS 数据库雪崩,宕机 2 次,造成几百万损失 ↩︎

  6. 一个危险 Redis 命令,导致公司损失 400 万!! ↩︎

你可能感兴趣的:(Redis)