Redis五大数据类型
查看当前进程
ps -ef |grep redis #当前进程
开启redis服务
(base) flora@MAC-3DGroup:~$ cd ~/myredis
(base) flora@MAC-3DGroup:~/myredis$ redis-server ./redis.conf
连接
redis-cli -p 6379
String
使用场景:
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
设置key 获取key
get获取 set设置
get
获得key值
set
设置key值
exists
是否存在
set k1 v1
get key
127.0.0.1:6379> set k1 v1 # 设置值
OK
127.0.0.1:6379> get k1 # 获得值
"v1"
127.0.0.1:6379> exists k1 #判断key 是否存在
(integer) 1
getset 先get再set
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"
mget mset 同时设置、获取多个值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量设置值
OK
127.0.0.1:6379> mget k1 k2 k3 #批量获取值
1) "v1"
2) "v2"
3) "v3"
mset 设置对象值的例子
setnx msetnx 不存在设置
setnx key
不存在设置
一般在分布式锁使用
127.0.0.1:6379> setnx k3 djsa #k3不存在 设置成功
(integer) 1
127.0.0.1:6379> setnx k3 aaaa #k3存在 设置失败
(integer) 0
msetnx k1 v1 k2 v2
批量设置
msetnx 是原子性操作,要么一起成功要么一起失败
也就是设置的key只要有一个是存在的,那所有的key都不能设置
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 #不存在key 设置 k1存在 设置失败
(integer) 0
127.0.0.1:6379> get k4 # 设置失败
(nil)
127.0.0.1:6379> get k1 #k1 还是原来的值
"v1"
setex 设置过期时间
setex(set with expire)
设置过期时间
ttl
剩余的时间
127.0.0.1:6379> setex key3 30 hello #设置key3 的过期时间是30s
OK
127.0.0.1:6379> ttl key3 # key3剩余的时间
(integer) 25
append 追加
append 在key后追加字符串,如果key不存在 相当于set key
127.0.0.1:6379> append k1 hahahas
(integer) 9
127.0.0.1:6379> get k1
"v1hahahas"
strlen 获取长度
127.0.0.1:6379> strlen k1
(integer) 9
i++
- incr 加1
127.0.0.1:6379> set views 0 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> incr views # 加1操作 (integer) 1 127.0.0.1:6379> incr views (integer) 2
- decr 减1
127.0.0.1:6379> decr views # 减1操作 (integer) 1 127.0.0.1:6379> decr views (integer) 0
- incrby 加指定的值 decrby 减指定的值
127.0.0.1:6379> decr views (integer) -1 127.0.0.1:6379> incrby views 9 #指定增量 (integer) 8 127.0.0.1:6379> decrby views 5 # 指定减量 (integer) 3
字符串范围
getrange 获得指定范围字符串
127.0.0.1:6379> set key1 hello,hahaha
OK
127.0.0.1:6379> get key1
"hello,hahaha"
127.0.0.1:6379> getrange key1 0 3 # 截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #获取全部字符串,等价于get key
"hello,hahaha"
setrange 替换 指定位置开始的字符串
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 #把从1开始的字符串换成xx
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
127.0.0.1:6379>
list
所有的list命令都是以l开头(也有r)的
实际是一个双向链表
使用场景:
- 消息排队
- 消息队列
- 栈
插入
lpush 从左边插入,插入到列表头部
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
rpush 从右边插入
将一个值或者多个值,插入到列表尾部(右)
127.0.0.1:6379> rpush list four
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
linsert 指定值 前/后插入
linsert
在指定值的前面 或后面插入值
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert mylist before world other #在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 # 在world 后插入new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
rpoplpush 移除列表的最后一个元素
rpoplpush mylist myotherlist
把mylist 的最后一个元素移除,移到myotherlist中
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
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>
移除
lpop rpop 从头或尾移除
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list # 移除list的第一个元素
"three"
127.0.0.1:6379> rpop list # 移除list的最后一个元素
"four"
lrem 移除指定的值
lrem key count value
移除list集合中指定个数的value
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "three"
3) "three"
4) "two"
127.0.0.1:6379> lrem list 1 one #移除list中one
(integer) 1
127.0.0.1:6379> lrem list 2 three #移除两个 值为 three的
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
ltrim 截取区间内的值
ltrim 通过下标截取指定的长度,这个list已经被改变了,截取了只剩下截取的元素
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> ltrim mylist 1 2 #截取[1,2] 内的值
OK
127.0.0.1:6379> lrange mylist 0 -1 # 截取后的值
1) "hello1"
2) "hello2"
更新
lset
将列表中指定下标的值替换为另外一个值
如果指定下标不存在 就会报错
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lset mylist 0 hahaha #更新下标为0的值
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hahaha"
2) "hello1"
127.0.0.1:6379> lset mylist 2 hahaha #索引不存在报错
(error) ERR index out of range
获取值
lrange 获取区间内的值
127.0.0.1:6379> lrange list 0 -1 #获取list中所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 2
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #可以看到是 符合先进后出
1) "three"
2) "two"
lindex 通过下标获取值
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 2
(nil)
127.0.0.1:6379> lindex list 0
"two"
llen 获取长度
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> llen list
(integer) 2
Set(集合)
set中的值不能重复
set 都是以s开头的
添加
sadd 添加元素
127.0.0.1:6379> sadd myset hello #向set中添加值
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset loveworld
(integer) 1
127.0.0.1:6379> smembers myset #查看所有值
1) "world"
2) "hello"
3) "loveworld"
移除
srem 移除指定元素
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> srem myset hello # 移除元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "loveworld"
spop 随机删除元素
127.0.0.1:6379> SMEMBERS myset
1) "hhaha"
2) "world"
3) "loveworld"
127.0.0.1:6379> spop myset
"world"
smove 将一个指定的值移到另一个集合
127.0.0.1:6379> smembers myset2
1) "set2"
127.0.0.1:6379> smembers myset
1) "hhaha"
2) "loveworld"
127.0.0.1:6379> smove myset myset2 loveworld #将myset 的loveworld移到myset2
(integer) 1
127.0.0.1:6379> smembers myset
1) "hhaha"
127.0.0.1:6379> smembers myset2
1) "set2"
2) "loveworld"
获取
smembers 查看指定set的所有值
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
sismember 判断一个值是不是在set中
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> sismember myset hello #hello是否在集合myset中
(integer) 1
srandmember 随机抽取指定个数的元素
127.0.0.1:6379> smembers myset
1) "hhaha"
2) "world"
3) "loveworld"
127.0.0.1:6379> SRANDMEMBER myset #随机抽取一个元素
"hhaha"
127.0.0.1:6379> SRANDMEMBER myset #随机抽取一个元素
"world"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽取两个元素
1) "world"
2) "hhaha"
scard 获取set集合中的个数
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
3) "loveworld"
127.0.0.1:6379> scard myset
(integer) 3
交并补
sdiff 差集
sunion 并集
sinter 交集
127.0.0.1:6379> SMEMBERS set1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SMEMBERS set2
1) "f"
2) "d"
3) "c"
127.0.0.1:6379> sdiff set1 set2 #差集
1) "a"
2) "b"
127.0.0.1:6379> sinter set1 set2 #交集
1) "c"
127.0.0.1:6379> sunion set1 set2 #并集
1) "f"
2) "b"
3) "c"
4) "a"
5) "d"
hash
map集合 key -map 这时候值是一个map集合
应用场景:
hash变更的数据 ,如用户信息的保存 user name age
hash更适合对象的存储
设置
hset
127.0.0.1:6379> hset myhash field1 ks
(integer) 1
hmset 同时设置多个值
127.0.0.1:6379> HMSET myhash field1 hello field2 world
OK
hsetnx 不存在设置
127.0.0.1:6379> hsetnx myhash field4 hello #不存在field4 设置成功
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 hello2 #存在field4 设置失败
(integer) 0
获取
hget
127.0.0.1:6379> hget myhash field1
"ks"
hmget 同时获取多个值
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
获取键、值
hgetall 获取所有键值对
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
hkeys 获取所有key
127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field3"
3) "field1"
hvals 获取所有值
127.0.0.1:6379> hvals myhash
1) "hhaha"
2) "hhaha"
3) "11hhaha"
hexists 指定key是否存在
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> HEXISTS myhash field1
(integer) 0
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379>
hlen 获取长度
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1
删除
hdel 删除指定key
key删除了 指定的值也就没有了
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 #删除指定key
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
自增 自减
127.0.0.1:6379> hset myhash field9 5
(integer) 1
127.0.0.1:6379> hincrby myhash field9 1 # 自增1
(integer) 6
127.0.0.1:6379> hincrby myhash field9 -1 #减1
(integer) 5
Zset(有序集合)
在set的基础上,增加了一个值 set k1 v1
应用场景:
- 排行榜应用实现
- 普通消息、重要消息 带权重进行判断
- 存储班级成绩表,工资表排序进行判断
添加
zadd
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"
移除
zrem
127.0.0.1:6379> zrange salary 0 -1
1) "ks"
2) "xi"
3) "xixi"
127.0.0.1:6379> zrem salary ks
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xi"
2) "xixi"
获取
zrange 获取指定区间的值
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
排序
zrangebyscore 按score从小到大排序
127.0.0.1:6379> zadd salary 2500 xi
(integer) 1
127.0.0.1:6379> zadd salary 25200 xixi
(integer) 1
127.0.0.1:6379> zadd salary 200 ks
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #从小到大排序
1) "ks"
2) "xi"
3) "xixi"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #排序且显示score
1) "ks"
2) "200"
3) "xi"
4) "2500"
zrevrange 从大到小排序
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores
1) "xixi"
2) "25200"
3) "xi"
4) "2500"
5) "ks"
6) "2222"
获取数量
zcard 获取整个set的个数
127.0.0.1:6379> zcard salary
(integer) 2
zcount 获取指定区间的成员数量
127.0.0.1:6379> zcount salary 200 300 # 这个区间内没有符合的
(integer) 0
127.0.0.1:6379> zcount salary 200 3009 # 整个区间内有两个符合条件的
(integer) 2