初始-redis
特点:
- 速度快
- 数据存在内存中。
- C语言实现,“距离”操作系统越近执行速度越快。
- 单线程,预防了多线程可能产生的竞争问题。
- Redis源代码精打细磨。
- 键值对的数据结构存储
- 五中键值对的形式,许多的应用场景,提高开发效率。
- 功能多
- 键过期
- 发布订阅
- lua脚本
- 事务功能
- 流水线
- 简单稳定
- 源码少
- 单线程
- 不需要依赖操作系统的类库,自己实现了事件处理的先关功能。
- 稳定到几乎没有宕机的情况。
- 客户端语言多
- 提供了TCP通信协议,很多编程语言可以很方便的接入到Redis。
- 持久化
- RDB和AOF
- 主从复制
- 高可用和分布式
应用场景
- 缓存
- 访问快
- 降低后端数据源的压力
- 键值过期,灵活控制最大内存和内存溢出后的淘汰策略。
- 排行榜系统
- 利用列表和有序集合的数据结构
- 计数器应用
- 利用加1操作
- 社交网络
- redis提供的数据结构更好实现:赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等。
- 消息队列
不适合的应用
- 冷数据。
- 数据规模相对比较大的。
应用
全局命令
- 查看所有键
- keys *
- 当存储特别键的时候谨慎使用
- 键总数
- dbsize
- 键是否存在
- exists key
- 存在返回1,不存在返回0。
- 删除键
- del key 【键名字】
- 返回删除键的个数,不存在返回0。
- 支持删除多个键:del a b c
- 键过期
- expire 【key】【seconds】
- ttl 【key】查看键剩余时间。
- 返回大于等于0的整数。-1:键没设置过期时间。-2键不存在。
- 键的数据类型
- type 【key】
- 键不存在返回none
数据类型和内部编码
数据类型都有自己的实现编码,多种实现。redis会在合适的场景选择合适的内部编码。
查看内部编码命令:object encoding hello
Redis设置内部编码的两个好处。
- 改进内部编码对外的数据结构和命令没有影响。对用户基本感知不到。
- 数据类型的多种实现编码在不同环境会转换。例如列表的内部编码,ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时redis会根据配置选项列表类型的内部实现转换为linkdlist。
五种类型
- 字符串
- 常用命令
- 内部编码3种
- int:8个字节的长整型。
- embstr:小于等于39个字节的字符串。
- raw:大于39个字节的字符串。
- 应用场景
- 缓存功能(常用)
- 计数——利用自增1。
- 共享Session
- 限速——一分钟不超过5次,利用键过期和自增/自减。
- value值最大为512MB
- 哈希hash——value={{field1,value1},…{fieldN,valueN}}
- 常用命令
- 内部编码,两种
- ziplist(压缩列表):哈希类型的元素个数小于hash-max-zoplist-entries配置(默认512个)。所有值都小于hash-max-ziplist-value配置(默认64字节)。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
- hashtable(哈希表):当ziplist无法满足哈希的条件时,元素多于512个或value大与64字节时ziplist的读写速度效率会下降。redis会转换成hashtable实现,读写快。
- 应用场景
- 哈希来存储关系型数据表记录。
- 需要注意的是哈希类型是稀疏的,而关系型数据库是完全结构化的。关系型数据库可以做复杂的关系查询,redis很难。
- 三种实现的优缺点
- 原声字符串类型:每个属性一个键
- set user:1:name tome
- set user:1:age 23
- set user:1:city beijing
- 优点:简单直观。
- 缺点:占用过多的键,内存占用量较大,同时用户信息内举行比较差,一般不会在生产环境使用。
- 序列化字符串类型:将用户信息序列化用一个键保存。
- set user:1: serialize(userInfo)
- 优点:简化编程,如果合理的使用序列化可以提高内存的使用效率
- 缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到redis中。
- 哈希类型:每个用户属性使用一对field-value,但是只用一个键保存。
- hmset user:1: name tom age 23 city beijing
- 优点:简单直观如果使用合理可以减少内存空间的使用
- 缺点:控制哈希在ziplist和hashtable两种内部编码的转化,hashtable会消耗更多内存。
- 列表list——列表最多存储2的23次方,减一个元素。列表在两端进行插入和弹出。
- 特点:1、列表中的元素是有序的,通过索引小标获取某个元素和某个范围的元素列表。2、元素可重复。
- 常用命令
- 内部编码
- ziplist(同上)
- linkedlist(链表):当ziplist无法满足列表条件时,redis会使用linkedlist作为列表的内部实现。
- 应用场景
- 消息队列
- 利用redis的lpush+brpop命令实现阻塞队列,多客户端使用brpop命令阻塞式的“抢”列表儿,多客户端保证了消费的负载均衡和高可用行。
- 文章列表
- 利用列表的有序性,不仅有序,同时支持索引范围获取元素。
- 其余
- lpush+lpop = Stack(栈)
- lpush+rpop = Queue(队列)
- lpush+ltrim = Capped Collection(有限集合)
- lpush+brpop = Massage Queue(消息队列)
- 集合set——保存多个元素,不予许重复并且元素无序。一个元素最多可存储2的32次方,减一个元素。支持多个集合的交集、并集、差集,合理地使用好集合类型解决很多实际问题。
- 常用命令
- 集合内添加元素
- sadd 【key】【 element element…】
- 返回结果为添加成功的个数。
- 删除元素
- srem 【key】【element element…】
- 返回删除成功的个数。
- 计算元素个数
- scard 【key】
- 判断元素是否在集合中
- sismemeber 【key】【element】
- element在集合中返回1,反而为0。
- 随机从集合返回指定个数元素
- srandmember 【key】[count]
- count是可选参数,不写默认为1
- 从集合随机弹出元素
- spop 【key】
- redis3.2版本开始支持spop[count]参数。
- 与srandmember的区别,spop弹出后在集合中删除了。
- 获取所有元素
- smembers 【key】
- 当元素比较多时可能会发生阻塞
- 集合间操作多个集合的交集
- sadd user:1:follow it music his sports
- sadd user:2:follow it news ent sports
- 交集:sinter 【key1 key2】
- 并集
- sunion 【key1 key2】
- 差集
- sdiff 【key1 key2】
- 返回key1的字符
- 交并差的结果保存
- sinterstore key1_2 【key1 key2】
- sunionstore key1_2 【key1 key2】
- sdiffstore key1_2 【key1 key2】
- 将key1和key2操作后的记过保存在key1_2中。
- 内部编码两种
- intset整数集合:集合中的元素都为整数并且个数小于set-max-instet-entries配置(512个),为了减少使用内存的使用。
- hashtable哈希表:集合无法满足intset时,使用hashtable作为内部实现。
- 应用场景
-
- 有序集合