Redis简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis能读的速度是110000次/s,写的速度是81000次/s 。

Redis五大数据类型

String(字符串)

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

127.0.0.1:6379> set name kexing #设置指定key的值
OK
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> get name #获取指定key的值
"kexing"
127.0.0.1:6379> GETRANGE name 0 3  #返回key中指定范围的子串
"kexi"
127.0.0.1:6379> GETSET name keke #覆盖掉原来的值
"kexing"
127.0.0.1:6379> get name
"keke"
127.0.0.1:6379> SETEX address 10 m78 #设置指定的key并设置过期时间
OK
127.0.0.1:6379> ttl address
(integer) 7
127.0.0.1:6379> ttl address
(integer) 5
127.0.0.1:6379> ttl address
(integer) 3
127.0.0.1:6379> ttl address
(integer) 1
127.0.0.1:6379> ttl address
(integer) -2
127.0.0.1:6379> SETNX phone 100  #只有在 key 不存在时设置 key 的值。
(integer) 1
127.0.0.1:6379> MSET hobby1 sing hobby2 run hobby3 coding #一次性设置多个值
OK
127.0.0.1:6379> INCR age  #将key自增1
(integer) 11
127.0.0.1:6379> DECR age #将key自减1
(integer) 10
127.0.0.1:6379> INCRBY age 10 #将key增加指定值
(integer) 20
127.0.0.1:6379> DECRBY age 10 #将key减少指定值
(integer) 10
127.0.0.1:6379> APPEND name hello  #在key尾添加字符串
(integer) 9
127.0.0.1:6379> get name
"kekehello"

List(列表)

在redis里,所有关于list的命令都是以L开头,不区分大小写

列表最多可存储 232 - 1 元素

127.0.0.1:6379> LPUSH mylist 1 2 3 #插入一个或多个值,以相当于双向链表,L是队头
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 0  
1) "3"
127.0.0.1:6379> LRANGE mylist 0 1  #查看0-1位置值
1) "3"
2) "2"
127.0.0.1:6379> 
127.0.0.1:6379> LRANGE mylist 0 -1 #查看mylist所有的值
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> RPUSH mylist 4 #在右边插入一个元素
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> LPOP mylist  #移除list第一个元素        
"3"
127.0.0.1:6379> RPOP mylist  #移除list最后一个元素
"4"
127.0.0.1:6379> LINDEX mylist 0  #获取list的下标值
"2"
127.0.0.1:6379> LLEN mylist  #获得list的长度
(integer) 2
##########################################################################
127.0.0.1:6379> LRANGE mylist 0 -1 
1) "3"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> LREM mylist 2 3 # 移除指定个数的值(移除2个list中的3 )
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "2"
2) "1"
##########################################################################
127.0.0.1:6379> LRANGE lists 0 -1
1) "hello3"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379> LTRIM lists 2 3 #截取指定范围的list值
OK
127.0.0.1:6379> LRANGE lists 0 -1
1) "hello1"
2) "hello"
##########################################################################
127.0.0.1:6379> RPUSH lists "hello" "hello1" "hello2" "hello3"
(integer) 4
127.0.0.1:6379> LRANGE lists 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> RPOPLPUSH lists lists2 #移除list最后一个元素并移到另一个list中
"hello3"
127.0.0.1:6379> LRANGE lists2 0 -1
1) "hello3"
##########################################################################
127.0.0.1:6379> LRANGE lists 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> LSET lists 0 hello0  #将list指定下标的值更新为另一个值
OK
127.0.0.1:6379> LRANGE lists 0 -1
1) "hello0"
2) "hello1"
3) "hello2"

小结

  • list实际上是一个链表结构,所以无论数据量多大,在头尾操作数据都是非常快速的
  • 如果key存在,则创建新的链表,新增结点
  • 如果结点不存在,则链表为null,即链表也不存在

Set(集合)

Redis 的 Set 是 string 类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

127.0.0.1:6379> SADD myset "hello" "world"  #向集合set中添加元素        
(integer) 2
127.0.0.1:6379> SMEMBERS myset  #查看set集合中的元素
1) "hello"
2) "world"
127.0.0.1:6379> SCARD myset #获取集合set中的个数
(integer) 2
127.0.0.1:6379> SREM myset hello  #移除集合set中的某个元素
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "world"
##################################################################################
127.0.0.1:6379> sadd sets hello hello1 hello2 hello3 hello4 hello5 hello 6 hello7
(integer) 8
127.0.0.1:6379> SMEMBERS sets
1) "hello"
2) "hello3"
3) "hello4"
4) "hello7"
5) "6"
6) "hello2"
7) "hello5"
8) "hello1"
127.0.0.1:6379> SRANDMEMBER sets  #随机抽出set中的元素
"hello3"
127.0.0.1:6379> SRANDMEMBER sets
"hello4"
127.0.0.1:6379> SRANDMEMBER sets
"hello7"
##################################################################################
127.0.0.1:6379> SMEMBERS sets
1) "hello"
2) "hello3"
3) "hello4"
4) "hello7"
5) "6"
6) "hello2"
7) "hello5"
8) "hello1"
127.0.0.1:6379> SPOP sets  #随机移除set中的元素
"hello1"
127.0.0.1:6379> SPOP sets
"hello2"
127.0.0.1:6379> SPOP sets
"hello7"
##################################################################################
127.0.0.1:6379> SMEMBERS sets
1) "hello"
2) "hello4"
3) "hello2"
4) "hello5"
5) "hello6"
6) "hello1"
127.0.0.1:6379> SMEMBERS sets2
1) "set2"
127.0.0.1:6379> SMOVE sets sets2 hello5  #将源集合中的某个元素移动到另一个集合中
(integer) 1
127.0.0.1:6379> SMEMBERS sets2
1) "set2"
2) "hello5"
###################################################################################
127.0.0.1:6379> SMEMBERS set1
1) "c"
2) "b"
3) "d"
4) "a"
127.0.0.1:6379> SMEMBERS set2
1) "f"
2) "c"
3) "e"
4) "g"
127.0.0.1:6379> SDIFF set1 set2     #差集
1) "b"
2) "a"
3) "d"
127.0.0.1:6379> SINTER set1 set2    #交集
1) "c"
127.0.0.1:6379> SUNION set1 set2    #并集
1) "f"
2) "e"
3) "c"
4) "a"
5) "b"
6) "g"
7) "d"

例如微博用户、共同关注,共同爱好,二度好友(推荐好友)都可用set实现

Hash(哈希)

map集合,key-map

hash 特别适合用于存储对象。

127.0.0.1:6379> HSET myhash key1 kexing                 #set一个具体的key-value
(integer) 1
127.0.0.1:6379> HGET myhash key1  #获取一个值
"kexing"
127.0.0.1:6379> HMSET myhash key2 kexing2 key3 kexing3 #set多个key-value
OK
127.0.0.1:6379> HMGET myhash key1 key2 key3          #获取多个值
1) "kexing"
2) "kexing2"
3) "kexing3"
127.0.0.1:6379> HGETALL myhash  #获取hash中全部的值
1) "key1"
2) "kexing"
3) "key2"
4) "kexing2"
5) "key3"
6) "kexing3"
127.0.0.1:6379> HDEL myhash key1  #删除hash中指定的字段
(integer) 1
127.0.0.1:6379> HGETALL myhash
1) "key2"
2) "kexing2"
3) "key3"
4) "kexing3"
127.0.0.1:6379> HLEN myhash #获取hash的字段数量
(integer) 2
127.0.0.1:6379> hkeys myhash
1) "key2"
2) "key3"
127.0.0.1:6379> hvalues myhash #获取该hash的所有键
127.0.0.1:6379> hvals myhash  #获取该hash的所有值
1) "kexing2"
2) "kexing3"

ZSet(有序集合)

在set的基础上增加一个值,sadd k1 v1, zadd k1 score v1

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

127.0.0.1:6379> zadd myzset 1 one #添加元素
(integer) 1
127.0.0.1:6379> zadd myzset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
###################################################################################
如何排序

127.0.0.1:6379> ZADD score 1000 zhangsan
(integer) 1
127.0.0.1:6379> ZADD score 2000 wanglaoji
(integer) 1
127.0.0.1:6379> ZADD score 100 kexing    #添加三个元素
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE score -inf +inf  #按照score排序 从小到大
1) "kexing"
2) "zhangsan"
3) "wanglaoji"
127.0.0.1:6379> ZREVRANGEBYSCORE score +inf -inf #按照score排序 从大到小
1) "wanglaoji"
2) "zhangsan"
3) "kexing"
127.0.0.1:6379> ZREVRANGEBYSCORE score +inf -inf withscores #按照score排序显示score 从大到小
1) "wanglaoji"
2) "2000"
3) "zhangsan"
4) "1000"
5) "kexing"
6) "100"
127.0.0.1:6379> ZRANGEBYSCORE score -inf 1500 withscores #score小于1500 从小到大排序
1) "kexing"
2) "100"
3) "zhangsan"
4) "1000"
###################################################################################
127.0.0.1:6379> ZRANGE score 0 -1
1) "kexing"
2) "zhangsan"
3) "wanglaoji"
127.0.0.1:6379> ZREM score wanglaoji  #移除指定的元素
(integer) 1
127.0.0.1:6379> ZRANGE score 0 -1
1) "kexing"
2) "zhangsan"
127.0.0.1:6379> ZCARD score #统计zset中元素个数
(integer) 2
###################################################################################
最后修改:2021 年 01 月 14 日 08 : 05 PM
如果觉得我的文章对你有用,请随意赞赏