目录

  • 基本知识
  • 五大数据类型
  • Redis-key
  • Strings:
  • List
  • set
  • hash(哈希)
  • zset(有序集合)


基本知识

cd /usr/local/bin/
启动 redis-server redisconfig/ redis.conf # 启动redisconfig/redis.conf配置文件启动
./redis-cli -h 主机 -p 6379 启动
auth password # 登陆
ping # 测试连接
select index #切换到指定索引的数据库
dbsize  # 查看db的大小
key * # 查看所有的key
flushdb # 清除当前数据库
flushall # 清除所有数据库

五大数据类型

Redis-key

exists xxx #判断数据库里是否存在xxxkey
keys * # 查看所有key
type xx #查看数据类型
move key index #移除当前的key
expire key 10  # 设置key的过期时间,单位为秒
ttl key # 查看当前key的剩余时间

Strings:

常用命令:

get key #获取值
 keys * # 获取所有的key
 exists key # 判断某个key是否存在
 append key “12” # 追加字符串,如果当前key不存在,那么相当于set key
 strlen key # 判断某个key的长度
 incr 自增
 mget 同时获取多个
 mset 同时设置多个
 del key 删除指定键值对
 getrange 获取字符串范围
 setrange 替换指定位置的字符串
 setex 设置过期时间
 setnx 不存在设置

strings案例:

################################################################
i++操作  可以做浏览量阅读量使用i++
# 步长 i+ = 
set views 0 # 设置当前浏览量为0
incr views # 自增1  当前浏览量为1
decr views # 自减1 当前浏览量为0
incrby views # 自增10 当前浏览量为10 
decrby views # 自减10 当前浏览量为0
################################################################
#  字符串范围
set name "hello,world"
getrange name 0 3  # 截取字符串 [0,3] 
"hell"
getrange name 0 -1 # 获取全部的字符串 和 get key 的方法是一样的

#  替换
set name abcdefg 
setrange name 1 xx #替换指定位置开始的字符串
get key 
"axxdefg"
##################################################################
# setex (set with expire) # 设置过期时间
# setnx (set if not exists) # 不存在设置 ( 在分布式锁中常常使用)
setex name 30 "hello" # 设置name的值为hello,过期时间为30秒
ttl name # 查看name的过期时间
setex mykey "123" # 如果mykey 不存在,那么设置mykey 的值为123
setex mykey "321" # 因为mykey 存在,所以设置mykey失败
get mykey 
"123"
###################################################################
#mset 同时设置多个值
#mget 同时获取多个值
mset k1 v1 k2 v2 k3 v3 # mset 同时设置k1 k2 k3
OK
 keys * # 查看所有的key
1) "k1"
2) "k3"
3) "k2"
mget k1 k2 k3 # mget 同时获取k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
 msetnx k1 v1 k4 v4 # msetnx 不存在设置 是一个原子性操作,要么一起成功,要么一起失败
(integer)0
127.0.0.1:6379> get k4
(nil)

########################################################################
# 对象
set user:1{name:zhangsan,age:3} # 设置一个user:1对象 值为json字符来把偶才能一个对象
# 这里的key是一个巧妙的设计: user:{id}:{filed} , 如此设计在Redis中是完全OK了!
127.0.0.1:6379> mset user:1:name xiaobai user:1:age 18 # 
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "xiaobai"
2) "18"
########################################################################
getset # 先get 在set
127.0.0.1:6379> getset db redis # 第一次先get db的值,则返回nil
(nil)
127.0.0.1:6379> get db # 因为get 在 set了db 的值所以返回redis
"redis"
127.0.0.1:6379> getset db mysql 
"redis"
127.0.0.1:6379> get db
"mysql"

String 使用场景:

  • 计数器
  • 统计多单位的数量: 粉丝,关注,浏览等等
  • 对象缓存存储

List

基本的数据类型,列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUFuRQUx-1613362118698)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20210212204129097.png)]

在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列!
所有的list命令都是用l开头的,Redis不区分大小命令

list常用命令:

lpush 左边插入
rpush 右边插入
lrange 获取指定位置的值
lpop 左边删除值
rpop 右边删除值
lindex 获取指定索引下的值
llen 获取列表的长度
lrem 移除列除list集合中指定个数的value,精确匹配
trim 截断指定下标开始的值
rpoplpush 移除列表最后一个元素,将他移动到新的列表中
lset 将列表中指定下标的值替换为新的值
linsert  将某个具体的value插入到列把你中某个元素的前面或者后面!

List案例:

######################################################
lpush # 左边插入  
rpush # 右边插入
127.0.0.1:6379> lpush list one two  # 将一个值插入,或者多个值插入到列表的头部(左)
(integer) 2
127.0.0.1:6379> lpush list three # 插入一个值,从左边开始插入
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # 获取list里的所有值 (通过区间获取具体的值!)
1) "three"
2) "two"
3) "one"
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"
#####################################################
lpop # 移除左边的值
rpop # 移除右边的值
127.0.0.1:6379> lpush list 1 2 3 4 5 # 在list 中从左开始插入 
(integer) 5
127.0.0.1:6379> lrange list 0 -1 # 查看list中所有的值
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop list # 移除列表中最左边的值
"5"
127.0.0.1:6379> rpop list # 移除列表中最右边的值
"1"
127.0.0.1:6379> lrange list 0 -1 # 查看list中所有的值
1) "4"
2) "3"
3) "2"
################################################
Lindex #通过index下标获取list的值
127.0.0.1:6379> lpush list 1 2 3 4 5 # list中从左边开始插入数据
(integer) 5
127.0.0.1:6379> lrange list 0 -1 # 查看list中所有的值
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lindex list 0 # 查看列表中索引为0 的值
"5"
#####################################################
Llen # 查看list中的长度
127.0.0.1:6379> lpush list 1 2 3  # list中插入3个值
(integer) 3
127.0.0.1:6379> llen list # llen 查看list的长度
(integer) 3
#####################################################
Lrem # 移除指定的值  取关 uid
127.0.0.1:6379> lpush list one two three three # 列表插入
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one  # 移除list中的1个one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three # 移除列表的一个three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three # 移除列表的2个three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
#####################################################
trim # 修剪: list截断 
127.0.0.1:6379> Rpush mylist "hello" "hello1" "hello2" "hello3" # 右边依次插入
(integer) 4
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"
########################################################################
rpoplpush # 移除列表的最后一个元素,及那个他移动到新的列表中
127.0.0.1:6379> lrange mylist 0 -1 # 查看列表的元素
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> rpoplpush mylist myotherlist # rpoplpush 将原来列表最后的元素迁移到新的列表中
"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"
########################################################################
lset # 将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> lset list 0 item # 如果不存在列表我们去更新就会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value 
(integer) 1
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> lset list 1 other # 如果不存在那么会报错
(error) ERR index out of range
########################################################################
linsert # 将某个具体的value插入到列把你中某个元素的前面或者后面!
127.0.0.1:6379> rpush mylist hello world # 插入两个元素
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert mylist before "world" "insertBefore" # 在mylist的world之前插入insertBefore
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "insertBefore" # 插入的数据
3) "world"
127.0.0.1:6379> linsert mylist after "world" "insertAfterItem" # 在mylist的world之后插入insertAfterItem
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "insertBefore"
3) "world"
4) "insertAfterItem"

小结

  • 他实际上是一个链表,before Node after , left,right 都可以插入值
  • 如果key 不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表不存在!
  • 在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~

消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

set

无序不重复集合

常用命令:

sadd 将元素添加到set中
smembers 获取所有的值
sismember 判断某个值是否存在set中
scard 查看set集合中有多少个元素
srem 移除set集合中指定的元素
srandmember 随机抽取一个元素
spop 随机删除某个元素
smove 将指定的值移动到另一个set集合
sdiff 差集
sunion 并集
sinter 交集

set案例:

########################################################################
#sadd 将元素添加到集合set中
#smembers 查看set中的值
# sismember 判断某个值是否在set集合中
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 "xiaobai"
(integer) 1
127.0.0.1:6379> smembers myset #查看set中的值
1) "xiaobai"
2) "hello"
3) "world"
127.0.0.1:6379> sismember myset xiaobai # 判断某个值是否在set集合中
(integer) 1
########################################################################
scard # 查看集合set中有多少个元素
srem # 移除set集合中的指定元素
127.0.0.1:6379> scard myset  # 查看集合set中有多少个元素
(integer) 3
127.0.0.1:6379> smembers myset
1) "xiaobai"
2) "hello"
3) "world"
127.0.0.1:6379> srem myset hello # 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "xiaobai"
2) "world"
########################################################################
set 无序不重复集合。抽随机!
srandmember # 抽取随机key
127.0.0.1:6379> srandmember myset  # 抽取set中的随机key
"world"
127.0.0.1:6379> srandmember myset
"hello"
127.0.0.1:6379> srandmember myset
"hello"
127.0.0.1:6379> srandmember myset 2 # 抽取set中的2个随机key
1) "hello"
2) "world"
########################################################################
删除指定的key,随机删除key
spop #删除
127.0.0.1:6379> smembers myset
1) "xiaobai"
2) "codewhite"
3) "hello"
4) "world"
127.0.0.1:6379> spop myset #随机删除key
"hello"
127.0.0.1:6379> spop myset #随机删除key
"world"
########################################################################
将指定的值移除到另外一个set集合中
127.0.0.1:6379> smembers myset # 查看myset集合中的所有元素
1) "xiaobai"
2) "codewhite"
3) "hello"
4) "world"
127.0.0.1:6379> sadd myset2 "code" # 在myset2集合中添加code
(integer) 1
127.0.0.1:6379> smove myset myset2 "hello" # 移动 myset中的"hello" 到 myset2中
(integer) 1
127.0.0.1:6379> SMEMBERS myset # 查看myset集合中的所有元素
1) "xiaobai"
2) "codewhite"
3) "world"
127.0.0.1:6379> SMEMBERS myset2 # 查看myset2集合中的所有元素
1) "code"
2) "hello"
########################################################################
微博,B站,共同关注(并集)
数字集合类"
	- 差集  sdiff
	- 并集  sunion
	- 交集  sinter
127.0.0.1:6379> sadd set1 a b c # sadd添加元素
(integer) 3
127.0.0.1:6379> sadd set2 c d f
(integer) 3
127.0.0.1:6379> sdiff set1 set2 # 差集
1) "b"
2) "a"
127.0.0.1:6379> sinter set1 set2 # 交集  共同好友可以这样实现
1) "c"
127.0.0.1:6379> sunion set1 set2 # 并集
1) "d"
2) "a"
3) "c"
4) "f"
5) "b"

微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)

hash(哈希)

Map集合,key-map! 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的
key-vlaue!

常用命令:

hset 添加一个键值
hget 获取一个键值
hmset 添加多个键值
hmget 获取多个键值
hgetall 获取所有键值
hlen 获取hash表字段的数量
hesixts 判断hash中指定字段是否存在
hkeys 获取所有字段
hvals 获取所有values
hincrby 指定增量
hsetnx 如果存在则设置

hash案例:

########################################################################
#hset 添加一个键值
#hget 获取一个键值
#hmset 添加多个键值
#hmget 获取多个键值
#hgetall 获取所有键值
127.0.0.1:6379> hset myhash field1 xiaobai # 添加一个键值
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取field1的值
"xiaobai"
127.0.0.1:6379> hmset myhash field1 xiaobai field2 hello #添加多对键值
OK
127.0.0.1:6379> hmget myhash field1 field2 #获取多对键值
1) "xiaobai"
2) "hello"
127.0.0.1:6379> hset myhash field1 code # 重复添加的话会迭代之前的key
(integer) 0
127.0.0.1:6379> hgetall myhash #获取所有键值
1) "field1"
2) "code"
3) "field2"
4) "hello"
##########################################################################
hlen # 获取hash表的字段数量!
127.0.0.1:6379> hmset myhash field1 hello field world # 添加两个key-value
OK
127.0.0.1:6379> hmget myhash field1 field # 获取两个key-value
1) "hello"
2) "world"
127.0.0.1:6379> hlen myhash #获取hash表的字段数量
(integer) 2
##########################################################################
hexists # 判断hash表中指定的字段存不存在
127.0.0.1:6379> hexists myhash field #  判断hash表中field字段存不存在 
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
##########################################################################
# 只获得所有field  hkeys
# 只获得所有value  hvals
127.0.0.1:6379> hmset myhahs field1 hello field2 world
OK
127.0.0.1:6379> hkeys myhahs # 只获得所有field
1) "field1"
2) "field2"
127.0.0.1:6379> hvals myhahs # 只获得所有value 
1) "hello"
2) "world"
##########################################################################
incr decr
127.0.0.1:6379> hset myhash field 1  #添加字段field
(integer) 1
127.0.0.1:6379> hincrby myhash field 2  #自增2
(integer) 3
127.0.0.1:6379> hincrby myhash field -1 #自减1
(integer) 2
127.0.0.1:6379> hsetnx myhash field2 hello # 如果不存在可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field2 hello # 如果存在不可以设置
(integer) 0
127.0.0.1:6379> hincrby myhash field2 1 #自增非integer的值报错
(error) ERR hash value is not an integer

hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的
存储,String更加适合字符串存储!

zset(有序集合)

在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1

常用命令

zadd myset 1 one 添加一个值或多个值
zrangebyscore key min max 由小到大排序 
zrevrange key start end 由大到小排序
zrem 移除有序集合中的某个元素
zcard 获取有序集合中的个数
zcount 获取指定区间的成员数量

zset案例:

##########################################################################
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 xiaobai #添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 5000 lisi
(integer) 1
127.0.0.1:6379> zadd salary 500 junshi
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf # 显示全部的用户 从小到大!
1) "junshi"
2) "xiaobai"
3) "lisi"
127.0.0.1:6379> zrevrange salary 0 -1 # zrevrange 由大到小
1) "lisi"
2) "xiaobai"
3) "junshi"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 显示所有用户并且附带成绩
1) "junshi"
2) "500"
3) "xiaobai"
4) "2500"
5) "lisi"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores # 显示工资小于2500员工的升序
1) "junshi"
2) "500"
3) "xiaobai"
4) "2500"
##########################################################################
# rem 移除集合中的指定的元素
127.0.0.1:6379> zrange salary 0 -1 # 查看集合中的所有元素
1) "junshi"
2) "xiaobai"
3) "lisi"
127.0.0.1:6379> zrem salary lisi # 移除lisi这个元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 
1) "junshi"
2) "xiaobai"
127.0.0.1:6379> zcard salary # 获取有序集合中的个数
(integer) 2
##########################################################################
127.0.0.1:6379> zadd salary 100 zhangsan # 添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 200 lisi 300 wangwu
(integer) 2
127.0.0.1:6379> zcount salary 100 300  # 获取指定区间的成员数量
(integer) 3
127.0.0.1:6379> zcount salary 100 200
(integer) 2