一、String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
应用场景:
常规计数:微博数、粉丝数、直播平台
1.添加数据
- 添加一个或多个key(SET、MSET)
#添加一个key
127.0.0.1:6379> set k1 v1
OK
#添加多个key
127.0.0.1:6379> mset k2 v2 k3 v3 k4 v4
OK
- 查看并修改数据(GETSET)
127.0.0.1:6379> getset k1 v111
"v1"
-
对数据进行递增、递减(INCR/INCRBY、DECR/DECRBY)
- 递增(INCR/INCRBY)
127.0.0.1:6379> set num 0 OK #单个数字逐级递增 127.0.0.1:6379> incr num (integer) 1 127.0.0.1:6379> incr num (integer) 2 #递增多个值 127.0.0.1:6379> incrby num 30 (integer) 32 127.0.0.1:6379> incrby num 100 (integer) 132
- 递减(DECR/DECRBY)
#但个数逐级递减 127.0.0.1:6379> decr num (integer) 41 127.0.0.1:6379> decr num (integer) 40 #递减多个数 127.0.0.1:6379> decrby num 20 (integer) 110
2.查询数据
- 查看key(GET)
127.0.0.1:6379> get k1
"110"
- 查看多个key(MGET)
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v111"
2) "v2"
3) "v3"
4) "v4"
- 查看key的长度(STRLEN)
127.0.0.1:6379> strlen k1
(integer) 4
- 查看指定长度的内容(GETRANGE )
127.0.0.1:6379> getrange k1 0 2
"v11"
127.0.0.1:6379> getrange k1 0 3
"v111"
127.0.0.1:6379> getrange k1 0 -1
"v111"
- 查看key的生存时间(TTL)
127.0.0.1:6379> TTL k1
(integer) -1
#-1 代表未设置生存时间
3.修改数据
- 修改key(SET)
127.0.0.1:6379> get k1
"v111"
127.0.0.1:6379> set k1 v111000
OK
127.0.0.1:6379> get k1
"v111000"
- 修改key某一个位置的值(SETRANGE)
#0 表示值的第一个位置
127.0.0.1:6379> setrange k1 0 1
(integer) 7
127.0.0.1:6379> get k1
"1111000"
- 追加数据到key(APPEND)
127.0.0.1:6379> append k1 11111
(integer) 12
127.0.0.1:6379> get k1
"111100011111"
4.删除数据
#删除一个key
127.0.0.1:6379> del k4
(integer) 1
#删除多个key
127.0.0.1:6379> del k2 k3
(integer) 2
二、Hash(哈希)
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
应用场景:
存储部分变更的数据,如用户信息,商品信息等。
最接近表结构的一种类型。可以给MySQL数据做缓存
1.添加数据
- 添加数据(HSET)
#添加单列数据
127.0.0.1:6379> hset city id 1
(integer) 1
- 添加多列数据(HMSET)
127.0.0.1:6379> hmset city name shanghai country china
OK
2.查看数据
- 查看单列数据(HGET)
127.0.0.1:6379> hget city id
"1"
- 查看多列数据(HMGET)
127.0.0.1:6379> hmget city id name
1) "1"
2) "shanghai"
- 查看全部数据(HGETALL)
127.0.0.1:6379> hgetall city
1) "id"
2) "1"
3) "name"
4) "shanghai"
5) "country"
6) "china"
3.修改数据
- 修改某一列的值(HSET)
127.0.0.1:6379> hset city name beijing
(integer) 0
127.0.0.1:6379> hgetall city
1) "id"
2) "1"
3) "name"
4) "beijing"
5) "country"
6) "china"
- 修改hash类型递增和递减(HINCRBY)
127.0.0.1:6379> hget city id
"1"
#递增
127.0.0.1:6379> hincrby city id 2
(integer) 3
127.0.0.1:6379> hget city id
"3"
#递减
127.0.0.1:6379> hincrby city id 2
(integer) 3
127.0.0.1:6379> hget city id
"3"
127.0.0.1:6379> hincrby city id -1
(integer) 2
127.0.0.1:6379> hget city id
"2"
4.删除数据
- 删除key中的某一列(HDEL)
127.0.0.1:6379> hdel city id
(integer) 1
- 删除key(DEL)
127.0.0.1:6379> del city
(integer) 1
三、List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
队列:先进先出
堆栈:后进先出
应用场景:
消息队列
比如sina微博:在redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。
但是做了限制不能超过5000个ID,因此获取ID的函数会一只询问redis。
系统不会像传统方式那样“刷新”缓存,redis实例中的信息永远是一致的。
SQL数据库(或是硬盘上的其他类型数据)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
1.添加数据
- 在头部(左边)插入数据(LPUSH)
#插入单个数据
127.0.0.1:6379> lpush city beijing
(integer) 1
#插入多个数据
127.0.0.1:6379> lpush city shanghai shengzhen
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "beijing"
2) "shanghai"
3) "hangzhou"
- 在尾部(右边)插入数据(RPUSH)
127.0.0.1:6379> rpush city hangzhou
(integer) 4
127.0.0.1:6379> rpush city nanjing hefei
(integer) 6
127.0.0.1:6379> lrange city 0 -1
1) "shengzhen"
2) "shanghai"
3) "beijing"
4) "hangzhou"
5) "nanjing"
6) "hefei"
2.查看数据
- 查看所有的数据(LRANGE)
127.0.0.1:6379> lrange city 0 -1
1) "shengzhen"
2) "shanghai"
3) "beijing"
4) "hangzhou"
5) "nanjing"
6) "hefei"
- 查看有多少个数据(LLEN)
127.0.0.1:6379> llen city
(integer) 6
- 查看指定列的数据(LINDEX)
#查看第一个
127.0.0.1:6379> lindex city 0
"shengzhen"
#查看第二个
127.0.0.1:6379> lindex city 1
"shanghai"
#查看第三个
127.0.0.1:6379> lindex city -1
"hefei"
- 从列表头部拿走数据(LPOP)
127.0.0.1:6379> lpop city
"shengzhen"
127.0.0.1:6379> lrange city 0 -1
1) "shanghai"
2) "beijing"
3) "hangzhou"
4) "nanjing"
5) "hefei"
- 从列表尾部拿走数据(RPOP)
127.0.0.1:6379> rpop city
"hefei"
127.0.0.1:6379> lrange city 0 -1
1) "shanghai"
2) "beijing"
3) "hangzhou"
4) "nanjing"
3.修改数据
- 修改指定位置数据(LSET)
127.0.0.1:6379> lset city 3 tianjin
OK
- 取出列表尾部的数据放到头部(RPOPLPUSH)
127.0.0.1:6379> rpoplpush city city
"tianjin"
127.0.0.1:6379> lrange city 0 -1
1) "tianjin"
2) "shanghai"
3) "beijing"
4) "hangzhou"
4.删除数据
- 删除指定数据的指定数据(LREM)
#删除city列表中的一个“tianjin”
127.0.0.1:6379> lrem city 1 tianjin
(integer) 1
##删除city列表中的两个“tianjin”
四、Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
应用场景:
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存到一个新的集合中。
1.增加数据
- 设置两个集合(SADD)
#集合中不会设置相同的值
127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd set2 1 3 5 7 9
(integer) 5
2.查询数据
- 查询集合中的数据(SMEMBERS)
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
- 判断集合中是否存在某个值(SISMEMBER)
127.0.0.1:6379> sismember set1 5
(integer) 1
127.0.0.1:6379> sismember set1 0
(integer) 0
- 查看集合有几个值(SCARD)
127.0.0.1:6379> scard set1
(integer) 5
- 取多个集合中的交集(SINTER)
#如果超过2个集合,则取前2个几个的交集再与后面的集合对比
127.0.0.1:6379> sinter set1 set2
1) "1"
2) "3"
3) "5"
- 取并集,将所有集合中的数据合并,并且去重(SUNION)
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "9"
- 对比集合,取出前者有而后者没有的值(SDIFF)
127.0.0.1:6379> sdiff set1 set2
1) "2"
2) "4"
127.0.0.1:6379> sdiff set2 set1
1) "7"
2) "9"
- 将得到的结果写到一个新的集合(SDIFFSTORE)
127.0.0.1:6379> sdiffstore diffset set1 set2
(integer) 2
127.0.0.1:6379> SMEMBERS diffset
1) "2"
2) "4"
- 随机取集合中的值(SRANDMEMBER)
127.0.0.1:6379> srandmember set1 2
1) "4"
2) "3"
127.0.0.1:6379> srandmember set1 2
1) "1"
2) "2"
3.修改数据
- 移动数据(SMOVE)
#移动数据,将集合1中的某一个指定数据移动到另一个集合
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> smembers set2
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
127.0.0.1:6379> smove set1 set2 2
(integer) 1
127.0.0.1:6379> smembers set2
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
6) "9"
4.删除数据
- 读取数据并移除(SPOP)
#随机在集合中删除一行数
127.0.0.1:6379> spop set1
"1"
- 删除指定的值(SREM)
127.0.0.1:6379> srem set1 5
(integer) 1
五、Zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
应用场景:
排行榜应用,取TOPN操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
1.增加数据
- 添加有序集合(ZADD)
127.0.0.1:6379> zadd score 99 zhangsan 91 lisi 100 wanger 80 mazi
(integer) 4
2.查看数据
- 查看集合中的数据数量(ZCARD)
127.0.0.1:6379> zcard score
(integer)
- 查看集合中成员(ZRANGE)
127.0.0.1:6379> zrange score 0 -1
1) "mazi"
2) "lisi"
3) "zhangsan"
4) "wanger"
- 查看集合中成员以及分数,默认升序(ZRANGE ... WITHSCORES)
127.0.0.1:6379> zrange score 0 -1 withscores
1) "mazi"
2) "80"
3) "lisi"
4) "91"
5) "zhangsan"
6) "99"
7) "wanger"
8) "100"
- 以升序方式查看集合中成员以及分数(ZREVRANGE)
127.0.0.1:6379> zrevrange score 0 -1 withscores
1) "wanger"
2) "100"
3) "zhangsan"
4) "99"
5) "lisi"
6) "91"
7) "mazi"
8) "80"
- 查看指定分数范围的人员(只显示人数)(ZCOUNT)
127.0.0.1:6379> zcount score 90 100
(integer) 3
- 查看指定分数范围的人员(显示成员及分数)(ZRANGEBYSCORE)
127.0.0.1:6379> zrangebyscore score 90 100 withscores
1) "lisi"
2) "91"
3) "zhangsan"
4) "99"
5) "wanger"
6) "100"
3.修改数据
- 指定成员增加分数(ZINCRBY)
127.0.0.1:6379> zincrby score 13 mazi
"93"
127.0.0.1:6379> zrevrange score 0 -1 withscores
1) "wanger"
2) "100"
3) "zhangsan"
4) "99"
5) "mazi"
6) "93"
7) "lisi"
8) "91"
4.删除数据
- 删除集合中的指定值(ZREM)
127.0.0.1:6379> zrem score wanger
(integer) 1