数据类型
前言
在了解数据类型之前,我们需要了解几个基本的命令:
命令 | 描述 |
---|---|
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的缓存问题
缓存雪崩
数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库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入门指南