什么是Redis?
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis的优势
性能极高
– Redis能读的速度是110000次/s,写的速度是81000次/s。丰富的数据类型
– Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。原子性
– Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的丰富的特性
– Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis键(Key)
Redis 键命令用于管理 redis 的键。
在Redis中,key命令是不区分大小写的,但是key对应的value是区分大小写的。
exp:
两条指令执行,得到的是两条不一样的数据
语法
Redis 键命令的基本语法如下: (命令 key [value])
redis 127.0.0.1:6379>
COMMAND KEY_NAME
实例
redis 127.0.0.1:6379>
SET key1 redis
OK
redis 127.0.0.1:6379>DEL key1
(integer) 1
常用Key
key*
查看当前库所有的key (但实际生产中禁止使用
,keys * 容易引起阻塞)exists key
判断某个key是否存在type key
查看某个key的数据类型del key
删除指定的key数据(数据量大时,也容易引起阻塞)unlink key
删除指定的key(s)。相比DEL会产生阻塞,该命令会在另一个线程中回收内存,因此它是非阻塞的
。仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。ttl key
查看还有多少秒过期,-1 表示永不过期 -2表示已经过期expire key seconds
为指定的key设置过期时间,以妙计pexpire key millseconds
为指定的key设置过期时间,以微妙计move key db值
将当前库的key 移到给定的数据库【0-15】dump key
序列化给定 key ,并返回被序列化的值。select db值
切换数据库【0-15】,默认数据库为0
那么如何查看当前数据库?
查看客户端的下标值,默认0不显示,其他数值表示当前库是对应的数值dbsize
查看当前数据库key的数量flushdb
清空当前数据库数据(实际生产中禁止使用
)flushall
清楚所有数据(实际生产中禁止使用
)help @数据类型
查看该数据类型的命令手册
Redis的数据类型
Redis的数据类型包含8种类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(Sorted Set:有序集合)、HyperLogLog(基数统计)、 BitMap (位图)`和 Geospatial (地理位置)
数据类型 | 简介 | 特性 | 使用场景 |
---|---|---|---|
String | 字符串 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | 1. 分布式锁 2.抖音点赞数(点下加1) |
Hash | 哈希(字典),键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1. 最新消息排行等功能(比如朋友圈的时间线) 2. 消息队列 |
Set | 哈希表实现,元素不重复 | 1.添加、删除,查找的复杂度都是O(1) 2.为集合提供了求交集、并集、差集等操作 | 1. 共同好友 2. 利用唯一性,统计访问网站的所有独立ip 3.好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(zset) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
String(字符串)类型
string 是 Redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型的值最大能存储 512MB。
Redis String(字符串)常用命令
序号 | 命令及描述 |
---|---|
1 | get key 获取指定 key 的值 |
2 | set key value [nx/ex] 设置指定 key 的值 |
3 | setnx key value 只有在 key 不存在时设置 key 的值 |
4 | setex key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |
5 | mset key value key2 value… 同时设置一个或多个 key-value 对 |
6 | mget key key2 获取所有(一个或多个)给定 key 的值 |
7 | msetnx key value 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
8 | getset key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value) |
9 | append key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾 |
10 | decr key 将 key 中储存的数字值减一 |
11 | incr key 将 key 中储存的数字值增一 |
12 | decrby key decrement key 所储存的值减去给定的减量值(decrement) |
13 | incrby key increment 将 key 所储存的值加上给定的增量值(increment) |
14 | strlen key 返回 key 所储存的字符串值的长度 |
15 | getbit key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit) |
16 | setbit key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
17 | getrange key start end 返回 key 中字符串值的子字符 |
应用场景
1、缓存功能
:String字符串是最常用的数据类型,不仅仅是redis,各个语言都是最基本类型,因此,利用redis作为缓存,配合其它数据库作为存储层,利用redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。
2、计数器
:许多系统都会使用redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。
3、共享用户session
:用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存cookie,但是可以利用redis将用户的session集中管理,在这种模式只需要保证redis的高可用,每次用户session的更新和获取都可以快速完成。大大提高效率。
4、分布式锁
setnx key value,当key不存在时,将key 的值设为 value ,返回1;若给定的 key 已经存在,则setnx不做任何动作,返回0。当setnx返回1时,表示获取锁,做完操作以后del key,表示释放锁;如果setnx返回0表示获取锁失败,可以通过以上的思路来实现分布式锁的机制。
List (列表)类型
List 列表用于存储多个有序的字符串。可以充当栈和队列的角色。
一个列表最多可以包含
2
32
2^{32}
232- 1 个元素 (4294967295, 每个列表超过40亿个元素)。
List是一个双端列表结构
,对两端的操作性能很高,但是通过索引下标操作中间节点性能较差。
List的值如果全部移除,那么对应的key也就消失了。
Redis List(列表) 常用命令
序号 | 命令及描述 |
---|---|
1 | lpush key value1 [value2…] 将一个或多个值插入到列表头部 |
2 | rpush key value [value2…] 在列表中添加一个或多个值到列表尾部 |
3 | lrange key start stop 获取列表指定范围内的元素 |
4 | lpop key <br移出并获取列表的第一个元素 |
5 | rpop key 移除列表的最后一个元素,返回值为移除的元素。 |
6 | lindex key index 通过索引获取列表中的元素 |
7 | llen key 获取列表长度 |
8 | lrem key count value 移除列表元素(删除count个值等于value的元素) |
9 | ltrim key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
10 | rpoplpush 源列表 目的列表 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
11 | lset key index value 通过索引设置列表元素的值 |
12 | linsert key before/after 已有值 新插入的值 在列表的元素前或者后插入元素 |
应用场景
微信公众号订阅的消息
消息队列
:reids的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据。文章列表或者数据分页展示的应用
。比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。
Hash 哈希类型
Redis的Hash是字符串类型的字段和字符串类型的值之间的映射,所以Hash是用于表示对象的完美数据类型(比如表示拥有名字、姓、年龄等的用户)
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储
2
32
2^{32}
232 - 1 键值对(40多亿)。
Redis hash(哈希) 常用命令
序号 | 命令及描述 |
---|---|
1 | hset key field value 将哈希表 key 中的字段 field 的值设为 value |
2 | hget key field 获取存储在哈希表中指定字段的值 |
3 | hmset key field value [field2 value2] 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
4 | hmget key filed [field2] 获取所有给定字段的值 |
5 | hgetall key 获取在哈希表中指定 key 的所有字段和值 |
6 | hdel key 删除一个或多个哈希表字段 |
7 | hlen key 获取哈希表中字段的数量 |
8 | hexists key field 查看哈希表 key 中,指定的字段是否存在 |
9 | hkeys key 获取哈希表中的所有字段 |
10 | hvals key 获取哈希表中所有值 |
11 | hsetnx key field value 只有在字段 field 不存在时,设置哈希表字段的值 |
12 | hincrby key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment |
应用场景
-
JD早期购物车,目前中小厂可用
-
存储对象
Set (集合)类型
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为
2
32
2^{32}
232- 1 (4294967295, 每个集合可存储40多亿个成员)。
Redis Set(集合) 常用命令
序号 | 命令及描述 |
---|---|
1 | sadd key value1 [value2] 向集合添加一个或多个成员 |
2 | smembers key 返回集合中的所有成员 |
3 | sismember key value 判断 member 元素是否是集合 key 的成员 |
4 | srem key value [value2] 移除集合中一个或多个成员 |
5 | scard key 获取集合的成员数 |
6 | srandmember key [count] 返回集合中一个或多个随机数 |
7 | spop key 移除并返回集合中的一个随机元素 |
8 | smove source destination member 将 member 元素从 source 集合移动到 destination 集合 |
9 | sdiff key [key2] 求两个集合的差集A-B(属于A但是不属于B) |
10 | sinsert key [key2] 返回给定所有集合的交集(同时属于AB部分) |
11 | sunion key [key2] 返回所有给定集合的并集(属于A或者属于B集合) |
12 | sinsertcard numberkeys key [key2] [limit count] redis7新特性,不返回结果集,而只返回交集产生的结果集的基数 |
应用场景
1、标签
。比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
2、共同好友功能
,共同喜好,或者可以引申到二度好友之类的扩展应用。
3、统计网站的独立IP
。利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。
4、微信抽奖小程序
,srandmember 或者spop 随机抽取多名幸运观众
Zset (sorted set 有序集合)类型
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数
。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复
。
集合是通过哈希表实现的,集合中最大的成员数为
2
32
2^{32}
232- 1 (4294967295, 每个集合可存储40多亿个成员)。
Redis Zset(有序集合) 常用命令
序号 | 命令及描述 |
---|---|
1 | zadd key score value1 [score2 value2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 | zrange key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员 |
3 | zrevrange key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
4 | zrangebyscore key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 |
5 | zscore key member 返回有序集中,成员的分数值 |
6 | zcard key 获取有序集合的成员数 |
7 | zrem key [key2] 移除有序集合中的一个或多个成员 |
8 | zincrby key increment member 有序集合中对指定成员的分数加上增量 increment |
9 | zcount key min max 计算在有序集合中指定区间分数的成员数 |
应用场景
1.排行榜
:积分排行榜,按得分排名。
2.任务队列
:优先处理任务,按处理时间排序。
3.范围搜索
:商城商品价格筛选,按价格范围获取商品列表。
4.社交网络
:根据用户关注度排序,按用户ID排序。