Redis 介绍
Redis 是什么?
- Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件;
- Redis 支持多种类型的数据结构,如 字符串(strings),散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) ,范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询;
- Redis 内置了复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions)和不同级别的 磁盘持久化(persistence);
- Redis 通过 哨兵(Sentinel) 和自动分区(Cluster)提供高可用性(high availability)。
Redis的特性
- 速度快
- 单节点读 110000次/s,写81000次/s
- 数据存放内存中
- 用 C 语言实现,离操作系统更近
- 单线程架构,6.0 开始支持多线程(CPU、IO 读写负荷)
- 持久化
- 数据的更新将异步地保存到硬盘(RDB 和 AOF)
- 多种数据结构 - 不仅仅支持简单的 key-value 类型数据,还支持:字符串、hash、列表、集合、有序集合,
- 支持多种编程语言
- 功能丰富
- HyperLogLog、GEO、发布订阅、Lua脚本、事务、Pipeline、Bitmaps,key 过期
- 简单稳定
- 主从复制
- Redis 支持数据的备份(master-slave)与集群(分片存储),以及拥有哨兵监控机制。
- Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作合并后的原子性执行。
Redis 典型使用场景
Redis 高并发原理
1、Redis 是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在 IO 上,所以读取速度快
2、Redis 使用的是非阻塞 IO,IO 多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换 时上下文的切换和竞争。
3、Redis 采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
4、Redis 存储结构多样化,不同的数据结构对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据 结构加快读取的速度。
5、Redis 采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。
Redis 数据结构与命令使用
Redis 的数据结构有:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集 合)。但这些只是 Redis 对外的数据结构,实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现, 这样 Redis 会在合适的场景选择合适的内部编码。
Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结 构的差异就在于 value 的结构不一样。
常用全局命令
- keys:查看所有键
- dbsize:键总数
- exists key:检查键是否存在
- del key [key …]:删除键
- expire key seconds:键过期
- ttl key: 通过 ttl 命令观察键键的剩余过期时间
- type key:键的数据结构类型
常用哈希命令
- hset key field value:设置值
- hget key field:获取值
- hdel key field [field …]:删除 field
- hlen key:计算 field 个数
- hmset key field value [field value …]:批量设置 field-value
- hmget key field [field …]:批量获取 field-value
- hexists key field:判断 field 是否存在
- hkeys key:获取所有 field
- hvals key:获取所有 value
- hgetall key:获取所有的 field-value
- incrbyfloat 和 hincrbyfloat:就像 incrby 和 incrbyfloat 命令一样,但是它们的作 用域是 filed
常用列表命令
-
rpush key value [value …]:从右边插入元素
-
lpush key value [value …]:从左边插入元素
-
linsert key before|after pivot value:向某个元素前或者后插入元素
-
lrange key start end:获取指定范围内的元素列表,lrange key 0 -1可以从左到右获取列表的所有元素
-
lindex key index:获取列表指定索引下标的元素
-
llen key:获取列表长度
-
lpop key:从列表左侧弹出元素
-
rpop key:从列表右侧弹出
-
lrem key count value:删除指定元素,lrem 命令会从列表中找到等于 value 的元素进行删除,根据 count 的不同 分为三种情况:
-
count>0,从左到右,删除最多 count 个元素。
-
count<0,从右到左,删除最多 count 绝对值个元素。
-
count=0,删除所有。
-
ltrim key start end:按照索引范围修剪列表
-
lset key index newValue:修改指定索引下标的元素
-
blpop key [key …] timeout 和 brpop key [key …] timeout:阻塞式弹出