Redis的五大基本数据类型为
StringListSetHashZset
1. Redis-Key
keys * : 查看所有的 keyset k v : 设置 kv 键值对exists k : 判断当前的k是否存在move k db : 将 k 移到编号为 db 的数据库中expire k time : 设置 k 过期的 time , 单位是秒ttl k : 查看 k 过期的剩余时间, 单位是秒type k : 查看 k 的数据类型
2. String
1. 字符串类型的基本操作
127.0.0.1:6379> set key1 v1 设置值
OK
127.0.0.1:6379> get key1 获得值
"v1"
127.0.0.1:6379> keys * 查看所有的key
1) "key1"
127.0.0.1:6379> exists key1 判断某一个key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" 往某一个key追加一个字符串, 如果当前key不存在, 就相当于 set 了一个 key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 获取字符串的长度
(integer) 7
127.0.0.1:6379> append key1 " , wang"
(integer) 14
127.0.0.1:6379> get key1
"v1hello , wang"
删除为 del key
2. 增加和减少(可以用来统计浏览量)
127.0.0.1:6379> set views 0 初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views incr ==> 自增1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views decr ==> 自减1
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10 incrby ==> 自增自定义的值
(integer) 10
127.0.0.1:6379> DECRBY views 5 decrby ==> 自减自定义的值
(integer) 5
3. 字符串范围
127.0.0.1:6379> set key1 "hello, wang"
OK
127.0.0.1:6379> GETRANGE key1 0 5 getrange ==> 获得范围内的字符串
"hello,"
127.0.0.1:6379> GETRANGE key1 0 -1 end设置为-1, start设置为0, 则可获得全部的字符串
"hello, wang"
获得整个字符串 getrange k 0 -1
4. 替换字符串
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 XX setrange k offset step ==> 从偏移量开始, 替换步长为 step 的内容
(integer) 7
127.0.0.1:6379> get key2
"aXXdefg"
5. setex setnx(在分布式锁中使用)
当指定的key存在时 : setex (set with expire and value) 设置过期时间与值 ====> setex key_name timeout value当指定的key不存在时: setnx (set if not exist ) 设置值 ====> setnx key_name value 如果此key存在, 则不会覆盖
6. 批量设置值
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 mset 直接写多个 kv 键值对
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3 mget 获取多个key的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx key1 v1 key4 v4 msetnx 多个值的不存在创建, 是原子性的, 这里第一个失败, 则全部失败
(integer) 0
注意: msetnx是一个原子性的操作, 要么所有的key都成功, 要么所有的key都失败
7. 设置对象 (JSON)
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}
OK
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"
127.0.0.1:6379> keys *
1) "user:1"
2) "key3"
3) "key2"
4) "key1"
本质上还是一个键值对, 设置成json的格式, user:1为key
8. 设置对象 (利用mset)
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
这里的key是一个巧妙的设计 : user:{id}:{field}
取出值用mget
9. getset
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb
"redis"
127.0.0.1:6379> get db
"mongodb"
如果不存在, 则返回nil
如果存在值, 则获取原来的值, 并设置新的值
10. 使用场景
value除了是我们的字符串, 还可以是数字
计数器统计多单位的数量粉丝数对象缓存存储
3. List
在redis中, 我们可以用 list 实现栈, 队列, 阻塞队列等等
所有的 list 命令都是以 l 开头的
1. 常用命令
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> rpush list right
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list
"three"
127.0.0.1:6379> rpop list
"right"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> llen list
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LREM list 1 one
(integer) 1
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello12"
(integer) 3
127.0.0.1:6379> rpush mylist "hello13"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello12"
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "hello2"
127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist world
(integer) 2
127.0.0.1:6379> linsert mylist before world other
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after world new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
lpush 将一个或者多个值, 插入列表的头部(左)
rpush 将一个或者多个值, 插入列表的尾部(左右
lrange 通过区间获得list中的值, 从左到右标号从0开始(先进后出)
lpop 移除头部的值(左)
rpop 移除尾部的值(右)
lindex 通过下标获得list中的某一个值
llen 返回列表的长度
lrem 移除指定的值, 其中数字指定移除的数量(精确匹配)
ltrim list from to 截取从 from 到 to 之间的值(含from和to), list已经被改变了, 只剩下截取的元素
rpoplpush fromList toList 移除列表最后一个元素, 并将其移动到新的列表中的到第一个元素处
exist 返回为0则不存在
lset key index value 更新指定下标的list的值, 如果该list或者下标不存在, 则报错
insert 将某一个具体的值插入到指定的值前后, 通过 before 和 after 指定前面和后面
2. 小结
它实际上是一个链表, before Node after , 在left 和 right 都可以插入值如果key不存在, 创建新的链表如果key存在, 新增内容如果移除了所有值, 空链表, 也代表不存在在两边插入或者改动值, 效率最高! 中间元素, 相对来说效率会低一点使用场景
消息排队消息队列lpush rpop ==> 队列lpush lpop ==> 栈
4. Set
Set 中的值是不能重复的!
set是无需不重复的集合
所有set命令都是以s开头的
1. 常用命令
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset wang
(integer) 1
127.0.0.1:6379> sadd myset zhangsan
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "wang"
2) "zhangsan"
3) "hello"
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> sismember myset world
(integer) 0
127.0.0.1:6379> sadd myset wang_2
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> smembers myset
1) "wang"
2) "wang_2"
3) "zhangsan"
127.0.0.1:6379> SRANDMEMBER myset
"wang_2"
127.0.0.1:6379> SRANDMEMBER myset
"zhangsan"
127.0.0.1:6379> SRANDMEMBER myset
"wang"
127.0.0.1:6379> SRANDMEMBER myset
"wang"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "wang"
2) "zhangsan"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "wang"
2) "wang_2"
127.0.0.1:6379> smembers myset
1) "wang"
2) "wang_2"
3) "zhangsan"
127.0.0.1:6379> spop myset
"wang"
127.0.0.1:6379> smembers myset
1) "wang_2"
2) "zhangsan"
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset wang
(integer) 1
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 wang
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> smembers myset2
1) "wang"
2) "set2"
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2
1) "c"
127.0.0.1:6379> sunion key1 key2
1) "b"
2) "a"
3) "c"
4) "e"
5) "d"
sadd 添加一个值smembers 查看set中的所有值sismember set value 查看value是否在set中, 在则返回1, 否则返回0scard 获取set中值的个数srem 移除set中的指定值srandmember 随机抽出一个元素, 可以在后面指定要抽出元素的个数spop 随机删除一个元素, 同样在后面可以指定要删除的元素的个数smove from to value 将一个值从源移到指定的目的地集合命令(共同关注的功能)
sdiff set1 set2 set1 和 set2 的差集(在set1但是不在set2中的值)sinter set1 set2 set1 和 set2 的交集sunion set1 set2 set1 和 set2 的并集
2. 使用场景
微博, A用户将所有关注的人放在一个set集合中, 将他的粉丝也放在一个集合中
可以实现共同关注, 共同爱好, 二度好友等功能
5. Hash
Map集合 ,key-map, 这时候这个值是一个map集合, 本质和string类型没有太大区别, 还是一个简单的key-value
所有的hash命令都是以h开头的
1. 常用命令
127.0.0.1:6379> hset myhash field1 wang
(integer) 1
127.0.0.1:6379> hget myhash field1
"wang"
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hexists myhash field1
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash
1) "world"
2) "hello"
127.0.0.1:6379> hset myhash field3 5
(integer) 1
127.0.0.1:6379> hincrby myhash field3 2
(integer) 7
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 6
127.0.0.1:6379> hsetnx myhash field4 world
(integer) 1
hset 存放一个hashmaphget 根据key取出对应的valuehmset 存放多个k-vhmget 根据keys取出多个valueshgetall 得到全部的k-vhdel 删除hash指定的key字段, 对易的value也被删除了!hlen 获取hash表的字段数量hexists 判断hash中的指定字段是否存在获取hash中的所有字段和值
hkeys 获取hash中的所有fieldhvals 获取hash中的所有的值hincrby 自增自减, 通过最后的步长设定增加还是减少hsetnx 只有在字段 field 不存在时, 设置哈希表字段的值
2. 使用场景
利用hash存储变更的数据 user name age, 尤其是用户信息之类的, 经常变动的信息!
hash更适合与对象的存储
127.0.0.1:6379> hset user:1 name wang
(integer) 1
127.0.0.1:6379> hget user:1 name
"wang"
6. Zset
有序集合, 在set的基础上, 增加了一个值 zset k1 score v1
所有的zset命令都是z开头的
1. 常用命令
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zadd salary 2500 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 wang
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "wang"
2) "xiaoming"
3) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "wang"
2) "500"
3) "xiaoming"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores
1) "wang"
2) "500"
3) "xiaoming"
4) "2500"
127.0.0.1:6379> zrange salary 0 -1
1) "wang"
2) "xiaoming"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaoming
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "wang"
2) "zhangsan"
127.0.0.1:6379> zcard salary
(integer) 2
127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "zhangsan"
2) "wang"
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 wang
(integer) 2
127.0.0.1:6379> zcount myset 1 3
(integer) 3
zadd key score value 添加一个值, score为排序编号zadd key score1 value1 score2 value2 添加多个值zrange 显示范围内的值zrangebyscore key min max [withscores] 升序排序, 指定范围, 用withscores显示score的值, (正无穷和负无穷分别为 +inf 和 -inf)zrem 移除指定的元素zcard 查看集合中的元素个数zrevrange 降序排序zcount 获取指定区间(scoure)的成员数量
2. 使用场景
存储班级成绩表, 工资表排序
设置权重 : 普通消息1 , 重要消息2
排行榜应用实现, 取Top N