数据类型

前言

在了解数据类型之前,我们需要了解几个基本的命令:

命令 描述
KEYS pattern 获得符合规则的键名列表
SET foo bar 设置一个键
GET foo 获取一个键
EXISTS foo 判断一个键是否存在
DEL foo 删除一个键
TYPE foo 获得键的数据类型

glob风格通配符规则

KEYS命令后的模式pattern支持glob风格通配符格式,具体规则如表:

符号 含义
? 匹配一个字符
* 匹配任意个(包括0个)字符
[] 匹配括号键的任一字符,可以使用”-“符号表示范围,如a[b-d]
\x 匹配字符x,用于转义符号,比如匹配”?”则为?

实现批量删除

DEL命令不支持通配符,但我们可以结合Linux管道和xargs命令实现批量删除,如:

1
redis-cli KEYS "user:*" | xargs redis-cli DEL

注意:

redis是单线程架构,如果redis包含了大量的键,执行keys命令可能会造成redis阻塞,所以一般建议不要在生产环境下使用keys命令。

如果非要遍历键删除的话,可以在以下三种情况使用:

  • 在一个不对外提供服务的Redis从节点上执行,这样不会阻塞到客户端的请求,但是会影响到主从复制。
  • 如果确认键值总数确实比较少,可以执行该命令。
  • 使用scan命令渐进式的遍历所有键,可以有效防止阻塞。

关于这块详细可以参考: redis如何实现批量删除key功能

Redis的数据类型

Redis的数据类型有以下几种:

  • 字符串类型(string)
  • 散列类型(hash)
  • 列表类型(list)
  • 集合类型(set)
  • 有序集合类型(zset)

字符串类型(string)

字符串类型可以存储任何形式的字符串,包括二进制数据,JSON化对象。

一个字符串类型键允许存储的数据最大容量是512M。

字符串类型键相关的命令:

命令 描述
INCR 当存储的是整数形式时, 使键自增
INCRBY 当存储的是整数形式时, 使键增加指定整数
DECR 当存储的是整数形式时, 使键自减
DECRBY 当存储的是整数形式时, 使键减少指定整数
APPEND 向尾部追加值
STRLEN 获取字符串长度
MGET 批量同时获取多个键
MSET 批量同时设置多个键
GETBIT key offset 获取字符串某位的二进制值
SETBIT key offset value 设置字符串某位的二进制值
BITCOUNT key 获得字符串类型键中二进制位值是1的位个数
BITOP [AND/OR/XOR/NOT] destkey key [key…] 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

散列类型

列表类型

集合类型

有序集合类型

Redis规范

什么是最佳实践?

一个岗位有很多人次从事过,势必会形成做事的最佳方式;

一个人做了很多工作,势必会在某个事项上做得最好。

把岗位做事的最佳方式和个人做得最好的事项一一总结出来,就是组织的最佳实践。

最佳实践常被用来作为一种强制行政标准以保证质量,其基础可以是自我评估和标杆管理。

Redis有哪些最佳实践?

最佳实践是规范, 是实践上的规范;

那问题可以解读为: 使用Redis有什么开发规范?

正好找到阿里Redis的开发规范, 总共有五个大点:

  • 一、键值设计
  • 二、命令使用
  • 三、客户端使用
  • 四、相关工具
  • 五、删除bigkey

参考链接

Redis的缓存问题

缓存雪崩

数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。

解决方案:

  • 缓存的过期时间多增加一个随机的时间, 让key随机失效
  • 定时任务, 定期刷新缓存

缓存穿透

缓存穿透是指查询一个一不存在的数据。例如:从缓存redis没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决方案:

  • 参数校验
  • 在第一次获取缓存后, 如果没有查询出来, 设置一个标记key; 第二次查询时, 查询标记key并且返回
  • 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,一般只有几分钟。
  • 布隆过滤器, 将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
  • 对恶意发起请求的ip过滤

缓存击穿;缓存并发

在秒杀等场景中, 某一热点key突然失效, 此时大量并发请求打到数据库上, 把数据库压垮

解决方案:

  • 对缓存查询加锁, 单体应用下使用互斥锁, 分布式使用分布式锁

Redis (Remote Dictionary Server)

Redis,即远程字典服务器的缩写.

Redis是一个高性能键值对的数据库.

Redis以字典结构存储数据,并允许其他应用通过TCP协议读写字典内容.

Redis提供了多种键值数据类型:

  • 字符串类型
  • 散列类型
  • 列表类型
  • 集合类型
  • 有序集合类型

Redis数据库的所有数据都存储在内存中,因此在性能上对比以硬盘存储的数据库有非常明显的优势.

但数据存储在内存中,无法保障数据无法丢失.

因此,Redis主要是作为缓存系统和队列系统.

在性能上,相较于同样出名的缓存系统 Memcache (MC)而言:

Redis是单线程模型,而MC支持多线程,所以在多核服务器下,MC的性能会更高一些

Redis约定版本号 (即第一个小数点后的数字) 为偶数的版本是稳定版,为奇数的版本是非稳定版.

目录

  • 配置与多数据库
  • 数据类型
  • 事务
  • 生存时间
  • 排序
  • 消息通知
  • 管道
  • 节省空间
  • 数据管理-RDB持久化
  • 数据管理-AOF持久化
  • 数据管理-主从复制与读写分离
  • 安全
  • 通信协议
  • MONITOR调试监控

参考书籍

  • Redis入门指南