Redis 非关 kv型
数据类型
数据类型丰富,字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets等等
字符串
1、字符串、数字,都会转为字符串来存储
2、以二进制的方式存储在内存中
-
注意:
key命名规范
可采用 - wang:email
key命名原则
1、key值不宜过长,消耗内存,且在数据中查找这类键值的计算成本高
2、不宜过短,可读性较差
值
1、一个字符串类型的值最多能存储512M内容
-
set key value nx ex
说明:设置一个字符串的key
特殊参数:
nx->not exist代表当key不存在时,才存储这个key
ex->expire过期时间,单位s
-
get key
说明:获取key的值
返回值:key的值或者'nil'
-
strlen key
说明:获取key存储 值 的长度
-
getrange key start stop
说明:获取指定范围切片内容[包含start stop]
-
setrange key index value
说明:从索引值开始,用value替换原内容;返回最新长度
- 批量操作
mset key1 value1 key2 value2 key3 value3
说明:批量添加key和value
mget key1key2key3
说明:批量获取key的值
数值操作
-
incrby key 步长 将key增加指定步长
-
decrby key 步长 将key减少指定步长
-
incr key: +1操作
-
decr key: -1操作
-
incrbyfloat key step 执行浮点数增量操作
INCRBYFLOAT mykey 1.5
不加数字 默认加1
应用场景 ⭐
-
缓存
说明:将mysql中的数据存储到redis字符串类型中
-
并发计数·点赞/秒杀 - 微博
说明:通过redis单进程单线程的特点,由redis负责计数,并发问题
转为串行问题
-
带有效期的验证码
说明:借助过期时间,存放验证码;到期后,自动消亡
字符串命令练习⭐⭐
1、查看db0库中所有的键
select 0 keys *
2、设置键trill:username对应的值为user001,并查看
set trill:username user001
get trill:username
3、获取trill::username值的长度
strlen trill:username
4、一次性设置tril:password、tril:gender、tril:fansnumber并查看(值自定义)
mset tril:password 123 tril:gender M tril:fansnumber 500
5、查看键trill::score是否存在
exist trill::score
6、增加10个粉丝[fansnumber]
incrby trill::fansnumber 10
7、增加2个粉丝(一个一个加)
incr trill::fansnumber
incrll trill::fansnumber
8、有3个粉丝取消关注你了
decrby trill::fansnumber3
9、又有1个粉丝取消关注你了
decr trill::fansnumber
10、思考、思考、思考,清除当前库
fiushdb
11、一万个思考之后,清除所有库
fiushall
过期时间设定 expire ⭐⭐⭐
只有字符串数据类型
在set存储数值的时候将过期时间存储上
早期版本是应用方案2进行使用的,慢慢的出现了方案一,但是方案一也仅仅局限于字符串数据类型
检查过期时间 ttl key
删除过期key机制
每个redis数据库中,都会有一个特殊的容器负责存储带有过期时间的ky以及它对应的过期时间,这个容器称之为"过期字典
针对过期字典中的key,redis结合惰性删除 和定期删除两大机制,有效删除过期数据
惰性删除
在 Redis 缓存系统中,可以使用惰性删除来处理过期的键,而不是在它们过期时立即删除,而是在下次访问时检查并删除。
定期删除
主动循环扫描检查
python 伪代码 redis C 语言编写的
python
DB NUMBERS=16#数据库数量
KEY_NUMBERS=20#每次检查key的数量
current db=0#记录当前检查到哪个库
# 每100ms调用
def activeExpireCycle():
for i in range(DB_NUMBERS): # 循环10次
if current_db == DB_NUMBERS: # 若是16个库扫描了一轮 则进行下一次扫描
current_db = 0
#获取当前数据库
redisDB = server.db[current_db]
first_start = True # 标记第一次删除
del_key_num = 0 # 删除key的数量
current_db =1 # 下次扫描的库
while (first_start or del_key_num > KEY_NUMBERS/4)
first_start = False
for j in range(KEY_NUMBERS): # 20
_key = redisDB.randomExpireKey() # 随机取key
if is_expire(key):
#过期则直接删除
delete_key(_key)
del_key_num += 1
if time_is_limit():
#若执行时间太长默认25毫秒
return
# 这个每100ms执行的方法 实际上最多执行 25 ms Redis单进程单线程 资源宝贵
- 最大内存检查
最后一道保险 - maxmemory配置选项
一旦内存量超过最大限制,redis会在执行命令时触发内存淘汰
(需手动在redis配置文件中激活maxmemoryi配置项)
- 主流淘汰机制如下:
volatile-lru: 从已设置过期时间的内存数据集中挑选最近最少使用的数据淘汰;
volatile-tt:从已设置过期时间的内存数据集中挑选即将过期的数据淘汰;
volatile-random:从已设置过期时间的内存数据集中任意挑选数据淘汰;
allkeys-lru:从内存数据集 中挑选最近最少使用的数据淘汰;
allkeys-random:从数据集中任意挑选数据淘汰;
no-enviction:禁入大多写命令