关于Redis那点事(一)
1. redis基本概念
- redis默认端口号:6379,默认共有16个数据库(0 ~ 15),如果不选择数据库,默认存储进入0号数据库
- redis是内存型数据库,数据的存储格式是K-V键值对形式,key是String类型的,value可以分为不同的数据结构,但是get查阅出来的所有的数据都是String类型
- reids的命令对大小写不敏感,但key对大小写敏感
2. redis数据结构
- String
#选择数据库
select 0
#查看已经使用字节数
dbsize
################ 增 ################
#普通增加
set key value
#增加多个key值和value值
mset key1 value1 key2 value2
#增加带生命周期的k-v(分两步进行)
set key value ex time
#增加带生命周期的k-v(原子性操作)
setex key time value(默认时间单位是秒)
psetex key time value(默认时间单位是毫秒)
#增加带生命周期的k-v,只有在key不存在的时候进行增加,若key存在则不覆盖
set key value ex time nx
################ 删 ################
del key
################ 改 ################
#对于普通的修改操作可以采用先删除再增加
#自增
Incr key
#自减
Decr key
#自定义的增减操作
IncrBy key 3
DecrBy key 3
################ 查 ################
#普通查看操作
get key
#查看多个key的操作
mget key1 key2
#查看一共有多少key(不推荐使用,耗费内存和时间)
key *
#查看key的生命周期
TTL key
#查看一个key是否存在,存在返回1,不存在返回0
Exists key
- Redis对于已经存在的key值进行set,新的值会覆盖掉旧的值
- Redis的自增、自减以及自定义的增减操作都是原子性的(可用于计数器的设置)
- TTL查看key的生命周期
- 如果key不存在TTL的返回值是 -2
- 如果key是永久存在的TTL的返回值是 -1
- Redis如何对已经过期的key进行删除
- 系统的当前时间容易获取,在进行set的时候,会将当前时间的时间戳和生命周期进行计算得到一个新的时间戳作为生命周期截止时间戳
- 在利用get进行查看的时候,系统会比较当前时间戳和截止时间戳,如果当前时间戳大于生命周期截止时间戳则表示这个key应该被删除,系统将key删除并返回一个nil
- 如果进行声明周期设置(setex)之后从未查看(get)此key值,则redis有轮询机制,会定期查看key的生命状况进行删除
- Set
- 普通的set集合是无序的,而且里面的元素是单一的
- 如果set集合里面都是整数,那么这个集合会自动排序,其余类型不会
- zset是有序集合
#SET 无序集合操作
################ 增 ################
SADD key v1 v2 v3 v4
################ 删 ################
#删除某个指定的值
SREM key value
#随机删除一个value值
SPOP key
################ 改 ################
#先删除再插入
SREM key value
SADD key v1
################ 查 ################
#查看某个key下所有的元素
SMEMBERS key
#查看某个value是否在这个key下
SISMEMBER key value
#查看某个key下一共有多少个元素
SCARD key
#集合操作
################ 交 ################
#简单交
SINTER key1 key2
#交集并将结果存入key中
SINTERSTORE key key1 key2
################ 并 ################
#简单并
SUNION key1 key2
#并集并将结果存入key中
SUNIONSTORE key key1 key2
################ 差 ################
#普通差(key1 - key2)
SDIFF key1 key2
#差集并将结果存入key中
SDIFFSTROE key key1 key2
#ZSET 有序集合操作
/**
ZSET 集合的value是带score(权重的),并且有些排序是根据权重进行排序
*/
################ 增 ################
#加入时的排序是根据输入的rank进行排序的
ZADD key 10 value1 20 vlaue2 30 value3
################ 删 ################
ZREM key value
#注意:没有zpop
#删除一个范围内全部的元素(左闭右闭,左小右大)
#根据scroe排序后的结果进行删除操作
ZREMRANGEBYSCORE key 70 80 ---> 删除成功
ZREMRANGEBYSCORE key 80 70 ---> 删除失败
#根据输入的顺序排序后的结果进行删除操作
ZREMRANGBYRANK key 0 1
#根据字典序的排序结果进行删除操作
ZREMRANGBYLEX key 0 1
################ 改 ################
#先删除再添加
################ 查 ################
#查看某个key的某个value的score
ZSCORE key value
#查看排名(从0开始)
ZRANK key
##按照rank的顺序去查询
#查询只能查到value的值查不到score的值
#查询key的第一个到第四个元素(rank 0~3)
ZRANGE key 0 3
#查询key的倒数四个元素
ZREVERANGE key 0 3
#查询key的全部元素
ZRANGE key 0 -1
##显示score的值的查询方式
#ZRANGE key 0 3 -->zrange方法不通共withscore的方法
ZRANGEBYSCORE key 0 3 withscore
- SADD必须添加进去的是不重复的数据,重复的数据添加不进去
- SADD是添加操作而不是覆盖操作
- SREM 和SPOP的区别
- SREM:删除一个指定key的指定的value的值,并且放回删除是否成功的消息
- SPOP:删除一个指定key的随机的value的值,并且将删除数据返回到屏幕上
- Redis的集合操作,如果是将得到的集合添加到原有的某个集合中,则执行的覆盖操作而不是添加操作
- Redis中的rank和Hive中的rank有所不同,Redis中的rank是按照Score进行排序,从0开始,不重复且不空位
- List
List是线性结构,key后面可以跟多个值
################ 增 ################
#左入队
LPUSH key 1 2 3 4 5
---> 5 4 3 2 1
#右入队
RPUSH key 1 2 3 4 5
---> 1 2 3 4 5
################ 删 ################
#左弹出一个元素
LPOP key
#右弹出一个元素
RPOP key
#左弹出一个元素(阻塞,在设定时间内一直轮询查询)
BLPOP key time
#右弹出一个元素(阻塞,在设定时间内一直轮询查询)
BRPOP key time
################ 改 ################
#根据下标修改元素
LSET key 2 value
#获取指定范围内的元素(下标)
LTRIM key 0 2
---> 查询第1个到第3个之间的所有元素
################ 查 ################
#根据下标获取元素
LINDEX key index
#获取指定范围内的元素[index1, index2]
LRANGE key index1 index2
- LPOP和BLPOP的区别
- LPOP非阻塞,BLPOP阻塞
- LPOP如果弹出的值为空,则会返回一个nil
- BLPOP如果弹出的值为空,则会在规定时间内轮询查询。
如果在轮询时间过后还是没有值插入则会返回一个nil,如果轮询时间内有值插入则会弹出值而不会返回nil- BLPOP 和 BRPOP 可以实现多队列的查询
BLPOP key1 key2 5
向左弹出任意元素,如果key1元素为空,则会弹出key2的任意元素,如果key1、key2都没有元素,则会在5s内轮询查找key1、key2,如果此时元素添加进来了就弹出,但是无法确认弹出的key1的值还是key2的值,因为轮询中无法确认指针的位置
- LRANGE操作
查询全部元素:LRANGE 0 -1
查询倒数第一个到倒数第二个元素:LRANGE -2 -1
注意:区间范围一定是左大右小,否则就会返回empty
- Hash
可以针对数据结构为:key {key1 value1, key2 value2}
################ 增 ################
#单个增
HSET key field value
#批量增
HMSET key field1 value1 field value2
################ 删 ################
HDEL key field1 field2
################ 改 ################
#先删除再增加
HDEL key filed
HSET key filed
################ 查 ################
#查询某个key下field的value值
HGET key field
#批量查询某个key下所有field的value值
HGETALL key
---> “field1 value1”“field2 value2”
#查询所有field信息
HKEYS key
#查询所有value信息
HVALS key
#查询某个field是否在某个key下存在
HEXISTS key field
---> "1"代表存在,“0”代表不存在