Redis缓存技术系列(二):简介+数据结构

1.redis 是什么

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

2.redis 安装(windows)

默认端口:6379

1.下载连接 https://github.com/tporadowski/redis/releases

2.解压

3.双击redis-server.exe启动服务端

4.双击redis-cli.exe启动客户端连接服务端

5.在客户端输入 “ping”,出现“PONG”,即证明连接成功

在这里插入图片描述
redis-benchmark //用于进行redis性能测试的工具

redis-check-dump //用于修复出问题的dump.rdb文件

redis-cli //redis的客户端

redis-server //redis的服务端

redis-check-aof //用于修复出问题的AOF文件

redis-sentinel //用于集群管理

3.数据结构

1.字符串(strings)

2.字符串列表(lists)

3.字符串集合(sets)

4.有序字符串集合(sorted sets)

5.哈希(hashes)

strings

1.添加(set)、查询(get)、追加(append)、获取长度(strlen),判断是否存在的操作(exists)、自增(incr)、自減(decr)

C:\Users\Edwin>redis-cli #运行redis客户端
127.0.0.1:6379> set name zwl # 插入一个key为‘name’值为‘zwl ’的数据
OK
127.0.0.1:6379> get name #获取key为‘name’的数据
"zwl"
127.0.0.1:6379> keys * #获取当前库所有的key
1) "\xac\xed\x00\x05t\x00\x04name"
2) "name"
3) "name2"
4) "name1"
127.0.0.1:6379> exists name #判断某个key是否存在,存在返回1
(integer) 1
127.0.0.1:6379> exists name3 #判断某个key是否存在,不存在返回0
(integer) 0
127.0.0.1:6379> strlen name # 判断key对应值的长度
(integer) 3
127.0.0.1:6379> append name zwl #为key为name的value追加zwl,返回总长度
(integer) 6
127.0.0.1:6379> strlen name # 判断key对应值的长度
(integer) 6
127.0.0.1:6379> get name
"zwlzwl"
127.0.0.1:6379> set name3 "hello zwl"  #注意点:插入的数据中如果有空格的数据,请用“”双引号,否则会报错!
OK
127.0.0.1:6379> get name3
"hello zwl"
127.0.0.1:6379> set name3 hello,zwl #逗号是可以的
OK
127.0.0.1:6379> get name3
"hello,zwl"
127.0.0.1:6379>
"3"
127.0.0.1:6379> set number 6
OK
127.0.0.1:6379> get number
"6"
127.0.0.1:6379> incr number #指定key为‘num’的数据自增1,返回结果  相当于java中 i++
(integer) 7
127.0.0.1:6379> get number #一般用来做文章浏览量、点赞数、收藏数等功能
"7"
127.0.0.1:6379> decr number  #指定key为‘num’的数据自减1,返回结果  相当于java中 i--,可以一直减为负数~
(integer) 6
127.0.0.1:6379> get number
"6"
127.0.0.1:6379> incrby number 10 #后面跟上by  指定key为‘number ’的数据自增‘参数(10)’
(integer) 16
127.0.0.1:6379> decrby number 10 #后面跟上by  指定key为‘number ’的数据自减‘参数(10)’
(integer) 6

2.截取(GETRANGE )、替换(SETRANGE )

127.0.0.1:6379> get name
"zwlzwl"
127.0.0.1:6379> getrange name 0 3 #截取字符串,相当于java中的subString,下标从0开始,不会改变原有数据
"zwlz"
127.0.0.1:6379> getrange name 0 -1 ##0至-1相当于 get key1,效果一致,获取整条数据
"zwlzwl"
127.0.0.1:6379> get name
"zwlzwl"
127.0.0.1:6379> set name hello,,,world
OK
127.0.0.1:6379> setrange name 5 999 #下标也是从0开始,然后替换后面3位位999
(integer) 13
127.0.0.1:6379> get name
"hello999world"
127.0.0.1:6379>

3.设置过期时间(setex ,ttl)、不存在设置操作(setnx)
(1)不存在设置操作:存在的时候不设置,不存在的时候设置

127.0.0.1:6379> setex name 10 zwl #setex是在创建的时候设置过期时间,过期时间为10秒的字符串数据
OK
127.0.0.1:6379> ttl name #查看key为‘name’的key的过期时间
(integer) 7
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name #返回为-2时证明该key已过期,即不存在
(integer) -2
127.0.0.1:6379>
127.0.0.1:6379> setnx name zwl #如果key为‘name’不存在,新增数据,返回值1
(integer) 1
127.0.0.1:6379> get name
"zwl"
127.0.0.1:6379> setnx name zwl #如果key为‘name’的已存在,设置失败,返回值0,也就是说这个跟set的区别是:set会替换原有的值,而setnx不会,存在即不设置,确保了数据误操作~
(integer) 0

4.mset、mget操作
(1)表示批量插入,批量读取。

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #插入多条数据
OK
127.0.0.1:6379> keys *
1) "k2"
2) "name"
3) "name1"
4) "\xac\xed\x00\x05t\x00\x04name"
5) "k3"
6) "k1"
7) "number"
8) "name2"
9) "name3"
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 #原子操作,要么一起成功,要么一起失败
(integer) 0
127.0.0.1:6379> msetnx k5 v5 k4 v4 # setnx如果有则返回0,没有才插入成功,返回1
(integer) 1
127.0.0.1:6379>

5.添加获取对象,getset操作

# 这里看上去像是对象,实际上还是字符串,只不过是对key设计了一下。
# 
127.0.0.1:6379> mset person:1:name zwl person:1:age 12
OK
127.0.0.1:6379> mget person:1:name person:1:age
1) "zwl"
2) "12"

127.0.0.1:6379> getset preson zwl #先get再set,先获取key,如果没有,set值进去,返回的是get的值
(nil)
127.0.0.1:6379> getset preson zwll #先获取key,如果有,set(替换)最新的值进去,返回的是get的值
"zwl"
127.0.0.1:6379> get preson #替换成功
"zwll"
127.0.0.1:6379>

总结:如何才能记得这么多命令呢?

list

1、lpush(左插入)、lrange(查询集合)、rpush(右插入)操作

127.0.0.1:6379> lpush listname value1 #新增一个集合
(integer) 1
127.0.0.1:6379> lpush listname value2 # 添加元素
(integer) 2
127.0.0.1:6379> lpush listname value3
(integer) 3
127.0.0.1:6379> lrange listname 0 -1  #查询listname 的所有元素值
1) "value3"
2) "value2"
3) "value1"
127.0.0.1:6379> lrange listname 0 2
1) "value3"
2) "value2"
3) "value1"
127.0.0.1:6379> lrange listname 0 1  #查询listname 的前几个元素值
1) "value3"
2) "value2"
127.0.0.1:6379> lpush listname1 value1 value2 value3 value4 #批量添加集合元素
(integer) 4
127.0.0.1:6379> lrange listname1 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
127.0.0.1:6379>

总结:先进去的会到后面,类似从上压栈。左=上,rpush 集合名 value #右插入,跟lpush相反,这里添加进去元素是在尾部!右=下

可以做的功能:比如更换头像,每次我们只获取最新的,如他想查询历史记录,那么可以遍历集合即可。

2、lpop(左移除)、rpop(右移除)操作

127.0.0.1:6379> lrange listname1 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
127.0.0.1:6379> lpop listname1 #从头部开始移除第一个元素
"value4"
127.0.0.1:6379> lrange listname1 0 -1
1) "value3"
2) "value2"
3) "value1"
127.0.0.1:6379> rpop listname1 #从尾部开始移除第一个元素
"value1"
127.0.0.1:6379> lrange listname1 0 -1 
1) "value3"
2) "value2"
127.0.0.1:6379>

3、lindex(查询指定下标元素)、llen(获取集合长度) 操作

127.0.0.1:6379> lrange listname 0 -1
1) "value3"
2) "value2"
3) "value1"
127.0.0.1:6379> lindex listname 1  #获取指定下标位置集合的元素,下标从0开始计数
"value2"
127.0.0.1:6379> lindex listname 0
"value3"
127.0.0.1:6379> llen listname #获取指定集合的元素长度
(integer) 3
127.0.0.1:6379>

4、lrem(根据value移除指定的值)

127.0.0.1:6379> lrange listname 0 -1
1) "value3"
2) "value2"
3) "value1"
127.0.0.1:6379> lrem list 1 value1 #移除集合list中的元素是v2的元素1个,写0也是移除一个
(integer) 1
127.0.0.1:6379> lrem list 1 value1 # 没有则不移除
(integer) 0
127.0.0.1:6379> lrem list 2 value2 # #移除集合list中元素为value2 的‘2’个,这里的参数数量,如果实际中集合元素数量不达标,不会报错,全部移除后返回成功移除后的数量值
(integer) 1
127.0.0.1:6379>

5、ltrim(截取元素)、rpoplpush(移除指定集合中最后一个元素到一个新的集合中)操作

127.0.0.1:6379> lrange listname 0 -1
 1) "v5"
 2) "v4"
 3) "v3"
 4) "v2"
 5) "v1"
 6) "v5"
 7) "v4"
 8) "v3"
 9) "v2"
10) "v1"
11) "value3"
12) "value2"
13) "value1"
127.0.0.1:6379> ltrim listname 1 4 # 从0开始,通过下标截取指定的长度,这个list已经被改变了,只剩下我们所指定截取后的元素
OK
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379>
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> rpoplpush listname newlistname #移除list集合中的最后一个元素到新的集合newlist中,返回值是移除的最后一个元素值
"v1"
127.0.0.1:6379> lrange newlistname 0 -1
1) "v1"
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379>

6、lset(更新)、linsert操作:在某之前或之后追加

127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> lset listname 1 value3 #更新list集合中下标为‘1’的元素为‘value3’
OK
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "value3"
3) "v2"
127.0.0.1:6379>
# 注意,如果集合不存在则报错
# 如果集合存在,但是指定的‘下标’不存在
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "value3"
3) "v2"
127.0.0.1:6379> linsert listname after value3 insertvalue3 #在集合中的‘v3’元素 ‘(after)之后’ 加上一个元素
(integer) 4
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "value3"
3) "insertvalue3"
4) "v2"
127.0.0.1:6379> linsert listname before value3 insertvalue3 #在集合中的‘v3’元素 ‘(before)之前’ 加上一个元素
(integer) 5
127.0.0.1:6379> lrange listname 0 -1
1) "v4"
2) "insertvalue3"
3) "value3"
4) "insertvalue3"
5) "v2"
127.0.0.1:6379>

实际上是一个链表
如果key 不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~
消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

set(set中所有的元素都是唯一的不重复的!)

1、sadd(添加)、smembers(查看所有元素)、sismember(判断是否存在)、scard(查看长度)、srem(移除指定元素)操作

127.0.0.1:6379> sadd setname v1 v2 v3 v4 v5 #添加set集合(可批量可单个)
(integer) 5
127.0.0.1:6379> smembers setname #查看set中所有元素
1) "v3"
2) "v4"
3) "v2"
4) "v1"
5) "v5"
127.0.0.1:6379> sismember setname v1  #判断某个值在不在set中,在返回1
(integer) 1
127.0.0.1:6379> sismember setname v11 #不在返回0
(integer) 0
127.0.0.1:6379> scard setname  #查看集合的长度
(integer) 5
127.0.0.1:6379> srem setname v1 #移除set中指定的元素
(integer) 1
127.0.0.1:6379> smembers setname
1) "v3"
2) "v5"
3) "v4"
4) "v2"
127.0.0.1:6379>

2、srandmember(抽随机)操作

127.0.0.1:6379> smembers setname
1) "v3"
2) "v5"
3) "v4"
4) "v2"
127.0.0.1:6379> SRANDMEMBER setname 1 #随机抽取myset中1个元素返回
1) "v4"
127.0.0.1:6379> SRANDMEMBER setname 1
1) "v4"
127.0.0.1:6379> SRANDMEMBER setname 1
1) "v4"
127.0.0.1:6379> SRANDMEMBER setname #不填后参数,默认抽1个值,但是下面返回不会带序号值
"v4"
127.0.0.1:6379> SRANDMEMBER setname 1
1) "v2"
127.0.0.1:6379> SRANDMEMBER setname 1
1) "v3"
127.0.0.1:6379> SRANDMEMBER setname 1
1) "v2"
127.0.0.1:6379> SRANDMEMBER setname 2
1) "v3"
2) "v2"
127.0.0.1:6379> SRANDMEMBER setname 2 #随机抽取myset中2个元素返回
1) "v3"
2) "v2"
127.0.0.1:6379> SRANDMEMBER setname 2
1) "v5"
2) "v4"
127.0.0.1:6379>

3、spop(随机删除元素)、smove(移动指定元素到新的集合中)操作

127.0.0.1:6379> smembers setname
1) "v3"
2) "v5"
3) "v4"
4) "v2"
127.0.0.1:6379> spop setname #随机删除1个元素,不指定参数值即删除1个
"v3"
127.0.0.1:6379> spop setname 2 #随机删除2个元素
1) "v2"
2) "v5"
127.0.0.1:6379> smembers setname
1) "v4"
127.0.0.1:6379> sadd setname v1 v2 v3 v4
(integer) 3
127.0.0.1:6379> smembers setname
1) "v3"
2) "v1"
3) "v4"
4) "v2" 
127.0.0.1:6379> smove setname setname2 2
(integer) 0
127.0.0.1:6379> smove setname setname2 v2  #移动指定set中的指定元素到新的set中
(integer) 1
127.0.0.1:6379> smembers setname
1) "v3"
2) "v1"
3) "v4"
127.0.0.1:6379> smembers setname2 #查询新的set集合,如果新的set存在,即往后加,如果不存在,则自动创建set并且加入进去
1) "v2"
127.0.0.1:6379>

4、sdiff(差集)、sinter(交集)、sunion(并集)操作【总结:可实现共同好友、共同关注等需求。】

127.0.0.1:6379> sadd myset1 v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> sadd myset2 v4 v5 v6 v7
(integer) 4
127.0.0.1:6379> sdiff myset1 myset2 #查询指定的set之间的差集,可以是多个set
1) "v3"
2) "v1"
3) "v2"
127.0.0.1:6379> sinter myset1 myset2 #查询指定的set之间的交集,可以是多个set
1) "v4"
127.0.0.1:6379> sunion myset1 myset2 #查询指定的set之间的并集,可以是多个set
1) "v5"
2) "v3"
3) "v7"
4) "v6"
5) "v1"
6) "v4"
7) "v2"
127.0.0.1:6379>

总结:可实现共有元素的需求

hash (类似map)

1、hset(添加hash)、hget(查询)、hgetall(查询所有)、hdel(删除hash中指定的值)、hlen(获取hash的长度)、hexists(判断key是否存在)操作

127.0.0.1:6379> hset hashname k1 v1 k2 v2 #添加key,value,批量添加
(integer) 2
127.0.0.1:6379> hget hashname k1 #获取hash中key为k1的值
"v1"
127.0.0.1:6379> hgetall hashname #获取hash中所有的值,包含key
1) "k1"
2) "v1"
3) "k2"
4) "v2"
127.0.0.1:6379> hset hashname k3 v3 k4 v4
(integer) 2
127.0.0.1:6379> hdel hashname k1 k2 #删除指定hash中的key(可多个),key删除后对应的value也会被删除
(integer) 2
127.0.0.1:6379> hgetall hashname
1) "k3"
2) "v3"
3) "k4"
4) "v4"
127.0.0.1:6379> hlen hashname #获取指定hash的长度
(integer) 2
127.0.0.1:6379> hexists hashname k1
(integer) 0
127.0.0.1:6379> hexists hashname k3 #判断key是否存在于指定的hash,存在返回1
(integer) 1
127.0.0.1:6379>

2、hkeys(获取所有key)、hvals(获取所有value)、hincrby(给值加增量)、hsetnx(存在不添加)操作

127.0.0.1:6379> hgetall hashname
1) "k3"
2) "v3"
3) "k4"
4) "v4"
127.0.0.1:6379> hkeys hashname #获取指定hash中的所有key
1) "k3"
2) "k4"
127.0.0.1:6379> hvalue hashname  #获取指定hash中的所有value
(error) ERR unknown command `hvalue`, with args beginning with: `hashname`,
127.0.0.1:6379> hvals hashname
1) "v3"
2) "v4"
127.0.0.1:6379> hset hashname k1 1 k2 2 
(integer) 2
127.0.0.1:6379> hincrby hashname k1 3 #让hash中k1的vakye指定+3(自增)
(integer) 4
127.0.0.1:6379> hincrby hashname k1 -1 #让hash中k1的value指定-1(自减)
(integer) 3
127.0.0.1:6379> hsetnx hashname k1 5 #添加不存在就新增返回新增成功的数量(只能单个增加) #添加存在则失败返回0
(integer) 0
127.0.0.1:6379> hsetnx hashname k5 5
(integer) 1
127.0.0.1:6379> hgetall hashname
 1) "k3"
 2) "v3"
 3) "k4"
 4) "v4"
 5) "k1"
 6) "3"
 7) "k2"
 8) "2"
 9) "k5"
10) "5"
127.0.0.1:6379>

总结:类似Java的map

zSet(有序集合)

1、zadd(添加)、zrange(查询)、zrangebyscore(排序小-大)、zrevrange(排序大-小)、zrangebyscore withscores(查询所有值包含key)操作

127.0.0.1:6379> zadd zsetname 1 v1 2 v2 3 v3 #添加zset值,可多个
(integer) 3
127.0.0.1:6379> zadd zsetname 1 v1 2 v2 3 v3 4
(error) ERR syntax error
127.0.0.1:6379> zrange zsetname 0 -1 #查询所有的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrangebyscore zsetname -inf +inf #将zset的值根据key来从小到大排序并输出
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrangebyscore zsetname 0 2 #只查询key<=2的值并且排序从小到大
1) "v1"
2) "v2"
127.0.0.1:6379> zrevrange zsetname 0 01
(error) ERR value is not an integer or out of range
127.0.0.1:6379> zrevrange zsetname 0 -1 #从大到小排序输出
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> zrangebyscore zsetname -inf +inf withscores #查询指定zset的所有值,包含序号的值
1) "v1"
2) "1"
3) "v2"
4) "2"
5) "v3"
6) "3"

2、zrem(移除元素)、zcard(查看元素个数)、zcount(查询指定区间内的元素个数)操作

127.0.0.1:6379> zrange zsetname 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrem zsetname v2 #移除指定的元素,可多个
(integer) 1
127.0.0.1:6379> zrange zsetname 0 -1
1) "v1"
2) "v3"
127.0.0.1:6379> zcard zsetname #查看zset的元素个数
(integer) 2
127.0.0.1:6379> zcount zsetname 0 3
(integer) 2
127.0.0.1:6379> zcount zsetname 1 3
(integer) 2
127.0.0.1:6379> zcount zsetname 2 3 #查询指定区间内的元素个数
(integer) 1
127.0.0.1:6379>

总结:排序等需求可以用zset来实现!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前期后期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值