Redis入门到精通day02
一、Redis简介
Redis(remote dictionary server) 远程字典服务器
1.特点
redis和其他KV缓存产品有以下三个特点:
1.持久化,重启后可以再次家在使用
2.数据类型丰富,同时提供list,set,zset,hash等数据结构存储
3.支持数据备份,即master-slave(主从模式)数据备份
2.作用
1.内存存储和持久化,支持异步写入同时不影响服务
2.支持取n个数据的操作
3.模拟类似于HTTPSession这种类型的设定过期时间的功能
4.发布,订阅消息系统
5.定时器,计数器
二、linux安装redis
这里使用docker安装redis
具体步骤见博客
挂载+进入容器运行
默认装载16个数据库
三、操作redis
1.进入redis
docker exec -it redis redis-cli
2.更换数据库编号
编号是0~数据库个数-1
127.0.0.1:6379> select 7 #选择6号数据库
OK
127.0.0.1:6379[7]>
3.入门指令
127.0.0.1:6379> DBSIZE #查询当前库的所有kv数量
(integer) 4
127.0.0.1:6379> keys * #查询当前库所有键
1) "backup3"
2) "backup2"
3) "backup4"
4) "backup1"
127.0.0.1:6379> set k1 v1 #存储k1-v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys k? #模糊查询k?
1) "k1"
2) "k2"
127.0.0.1:6379> FLUSHDB #删除当前库数据
127.0.0.1:6379> FLUSHALL #删除所有库数据
四、常用五大数据类型
String,Hash,List,Set,Zset
1.String
是最基本的类型,一个K对应一个V
String类型是二进制安全的,可以包含任意数据比如jpg或者序列化对象,V最多可以是512M
2.Hash
hash是一个键值对集合,特别适合存储对象,类型与Map<String,Object>
3.List
列表是简单的字符串列表,可以在头部或者尾部添加,底层实现是链表
4.Set
是String的无序集合,底层使用HashTable实现
5.Zset
Zset是有序集合,也是String类型的集合,不允许存在重复的成员,每个元素都会关联一个double类型的分数,通过这个分数进行从小到大排序。
Zset的成员是唯一的,分数是可以重复的
五、常用命令
1.redis键(key)
keys * 查询所有key
exists key的名字 判断某个key是否存在
move key db 从当前库移动到db库
expire key 秒钟 为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> EXISTS k1 #是否存在k1,存在1,不存在0
(integer) 1
127.0.0.1:6379> EXISTS k5
(integer) 0
127.0.0.1:6379> MOVE k1 1 #将k1移动到第二个库
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
127.0.0.1:6379> EXPIRE k2 10 #设置k2过期时间为10秒
(integer) 1
127.0.0.1:6379> TTL k2 #查询过期时间,如果已经过期就是-2,-1表示永不过期
(integer) 7
127.0.0.1:6379> keys *
1) "k3"
127.0.0.1:6379> TYPE k3 #查询k3类型为String
string
2.redis字符串(String)
set/get/del/append/strlen 设置/获取/删除/追加/字符串长度
Incr/decr/incrby/decrby 在value是数字的前提下操作,加1/减1/加上一个值/减去一个值
getrange/setrange 获取范围/设置范围
setex(set with expire)键秒值/setnx(set if not exist) 设置过期时间/如果不存在则设置
mset/mget/msetnx 同时设置多个kv/获取多个kv/同时设置多个kv,并要求所有要设置的kv都不存在
getset(先get再set) 获取旧值设置新值
127.0.0.1:6379> set k1 v1 #设置k1
OK
127.0.0.1:6379> get k1 #获取k1的值
"v1"
127.0.0.1:6379> del k1 #删除k1的值
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> APPEND k1 123 #v1后面追加123
(integer) 5
127.0.0.1:6379> STRLEN k1 #查询k1的长度
(integer) 5
127.0.0.1:6379> GET k1
"v1123"
127.0.0.1:6379> set k1 1 #v必须是数字
OK
127.0.0.1:6379> INCR k1 #自增1
(integer) 2
127.0.0.1:6379> INCR k1
(integer) 3
127.0.0.1:6379> INCR k1
(integer) 4
127.0.0.1:6379> INCR k1
(integer) 5
127.0.0.1:6379> DECR k1 #自减1
(integer) 4
127.0.0.1:6379>
127.0.0.1:6379> DECR k1
(integer) 3
127.0.0.1:6379> DECR k1
(integer) 2
127.0.0.1:6379> DECR k1
(integer) 1
127.0.0.1:6379> INCRBY k1 2 #增加2
(integer) 3
127.0.0.1:6379> INCRBY k1 2
(integer) 5
127.0.0.1:6379> INCRBY k1 2
(integer) 7
127.0.0.1:6379> DECRBY k1 2 #减去2
(integer) 5
127.0.0.1:6379> DECRBY k1 2
(integer) 3
127.0.0.1:6379> DECRBY k1 2
(integer) 1
127.0.0.1:6379> set k2 v1234
OK
127.0.0.1:6379> GETRANGE k2 0 -1 #GETRANGE 键 0 -1 查询整个v1
"v1234"
127.0.0.1:6379> GETRANGE k2 0 1 #GETRANGE 键 n m 查询v1的n-m索引值
"v1"
127.0.0.1:6379> SETRANGE k2 0 xxx #SETRANGE 键 n xxx 修改从n索引后面为xxx
(integer) 5
127.0.0.1:6379> get k2
"xxx34"
127.0.0.1:6379> SETEX k2 5 10 #设置一个值为10的k2,过期时间为5秒
OK
127.0.0.1:6379> SETNX k1 5 #如果存在k1则设置成功否则设置失败
(integer) 0
127.0.0.1:6379> SETNX k2 5
(integer) 1
127.0.0.1:6379> get k2
"5"
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 #保存k1=v1 k2=v2 k3=v3
OK
127.0.0.1:6379> MGET k1 k2 k3 #获取k1,k2,k3的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> MSETNX k1 111 k4 112 #具有原子性,如果有一个不能加,其他都不行
(integer) 0
127.0.0.1:6379> MSETNX k5 111 k4 112
(integer) 1
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> getset k1 new #获取旧值并将新值传入
"v1"
127.0.0.1:6379> get k1
"new"
3.redis列表(list)
lpush/rpush/lrange 从左边压入数据/从右边压入数据/从左边范围
lpop/rpop 从左边出栈/从右边出栈
lindex 按照索引下标获得元素(从上到下)
llen 队列长度
lrem key 删N个value
ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush 右边出栈加载左边
lset key index value
linsert key before/after 值1 值2 在key值前/后插入值
127.0.0.1:6379> LPUSH list1 1 2 3 4 5 #从左边压入数据
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1 #获取list1全部数据
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> RPUSH list2 1 2 3 4 5 #从右边压入数据
(integer) 5
127.0.0.1:6379> LRANGE list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lpop list1 #左边出栈
"5"
127.0.0.1:6379> rpop list1 #右边出栈
"1"
127.0.0.1:6379> lpop list2
"1"
127.0.0.1:6379> rpop list2
"5"
127.0.0.1:6379> LINDEX list1 0 #LINDEX list1 n 获取索引n处的值
"4"
127.0.0.1:6379> LINDEX list2 0
"2"
127.0.0.1:6379> LLEN list1 #获取列表元素数量
(integer) 3
127.0.0.1:6379> RPUSH list1 1 2 3 4 5 5 5 6 7
(integer) 9
127.0.0.1:6379> LREM list1 2 5 #删除List1中从左往右的2个5
(integer) 2
127.0.0.1:6379> LRANGE list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> LRANGE list2 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> RPOPLPUSH list1 list2 #将List1的右边第一个元素出栈压入到List2的左边
"7"
127.0.0.1:6379> LRANGE list2 0 -1
1) "7"
2) "2"
3) "3"
4) "4"
4.redis集合(Set)
sadd/smembers/sismember 添加集合/列出集合数据/看是不是集合的数据
scard 获取集合里面的元素个数
srem key value 删除集合中元素
srandmember key 某个整数(随机出几个数)
spop key 随机出栈
smove key1 key2 在key1里某个值 作用是将key1里的某个值赋给key2
差集:sdiff
交集:sinter
并集:sunion
127.0.0.1:6379> SADD set1 1 2 3 4 5 #创建set1将12345添加进去
(integer) 5
127.0.0.1:6379> SMEMBERS set1 #set1的所有数据
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SISMEMBER set1 3
(integer) 1
127.0.0.1:6379> SCARD set1 #显示set1个数
(integer) 5
127.0.0.1:6379> SREM set1 3
(integer) 1
127.0.0.1:6379> SRANDMEMBER set1 #随机出一个数,不删除
"5"
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "4"
4) "5"
127.0.0.1:6379> spop set1 #随机出栈一个数
"1"
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "4"
3) "5"
127.0.0.1:6379> SADD set2 2 3
(integer) 2
127.0.0.1:6379> SMOVE set1 set2 5 #将set1的5移到set2
(integer) 1
127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> SADD set2 1 2 3 7 8
(integer) 5
127.0.0.1:6379> SDIFF set1 set2 #取set1为主,找出两个集合的差集
1) "4"
2) "5"
127.0.0.1:6379> SINTER set1 set2 #找出两个集合的交集
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SUNION set1 set2 #找出两个集合的并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "8"
5.redis哈希(hash)
以kv形式存储,但是v存储的是kv形式
hset/hget/hmset/hmget/hgetall/hdel
hlen
hexists key 在key里面的某个值的key
hkeys/hvals
hincrby/hincrbyfloat
hsetnx
127.0.0.1:6379> hset hash1 age 10 #添加age=10的hash表
(integer) 1
127.0.0.1:6379> HGET hash1 age #查找hash1中的age值
"10"
127.0.0.1:6379> HMSET hash2 name zhangsan age 18 #多kv添加
OK
127.0.0.1:6379> hmget hash2 name age #获取多属性name,age的值
1) "zhangsan"
2) "18"
127.0.0.1:6379> HGETALL hash2 #获取hash2的所有kv对
1) "name"
2) "zhangsan"
3) "age"
4) "18"
127.0.0.1:6379> HDEL hash2 name #删除hash2的name键值对
(integer) 1
127.0.0.1:6379> HGETALL hash2
1) "age"
2) "18"
127.0.0.1:6379> HLEN hash2 #hash2的长度
(integer) 1
127.0.0.1:6379> HEXISTS hash2 age #hash2是否存在age属性
(integer) 1
127.0.0.1:6379> HSET hash3 name lisi age 20 sex nan
(integer) 3
127.0.0.1:6379> hgetall hash3
1) "name"
2) "lisi"
3) "age"
4) "20"
5) "sex"
6) "nan"
127.0.0.1:6379> hkeys hash3 #获取hash3的所有keys
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS hash3 #获取hash3的所有values
1) "lisi"
2) "20"
3) "nan"
127.0.0.1:6379> HINCRBY hash3 age 2 #hash3的age加2
(integer) 22
127.0.0.1:6379> HINCRBYFLOAT hash3 age 0.5 #hash3的age加0.5
"22.5"
127.0.0.1:6379> hsetnx hash3 age 50 #如果存在则不加,如果不存在则添加
(integer) 0
127.0.0.1:6379> hsetnx hash3 money 50
(integer) 1
6.redis有序集合(Zset)
集合方式是 key score value
zadd/zrange 添加/范围
zrangebyscore key 开始score 结束score
zrem key 某score下对应的value值,作用是删除元素
zcard/zcount key score区间/zrank key values值,作用是获得下标值/zscore key 对应值,获得分数
zrevrank key values值,作用是逆序获得下标值
zrevrange
zrevrangebyscore key 结束score 开始score
127.0.0.1:6379> ZADD zset1 10 v1 20 v2 40 v3 30 v4 #按照key score value添加
(integer) 4
127.0.0.1:6379> ZRANGE zset1 0 -1 #查询所有zset1
1) "v1"
2) "v2"
3) "v4"
4) "v3"
127.0.0.1:6379> ZRANGE zset1 0 1 #查询0-1位置的zset1
1) "v1"
2) "v2"
127.0.0.1:6379> ZRANGEBYSCORE zset1 10 30 #按10-30分数排列zset,加上(表示不含
1) "v1"
2) "v2"
3) "v4"
127.0.0.1:6379> ZREM zset1 v3 #删除v3
(integer) 1
127.0.0.1:6379> ZCARD zset1 #zset1的元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT zset1 10 20 #获取分数为10-20的zset1集合中个数
(integer) 2
127.0.0.1:6379> ZRANK zset1 v4 #获取value为v4的值的下标
(integer) 2
127.0.0.1:6379> ZSCORE zset1 v4 #获取v4的分数
"30"
127.0.0.1:6379> ZREVRANK zset1 v4 #获取v4的逆序下标
(integer) 0
127.0.0.1:6379> ZREVRANGE zset1 0 -1 #获取zset1所有逆序元素
1) "v4"
2) "v2"
3) "v1"
127.0.0.1:6379> ZREVRANGEBYSCORE zset1 40 10 #分数从大到小获取40-10的逆序元素
1) "v4"
2) "v2"
3) "v1"