当前位置: 首页 > article >正文

redis | 认识非关系数据库Redis的字符串数据类型及过期时间expire的作用

Redis 非关 kv型

    • 数据类型
      • 字符串
        • 数值操作
      • 应用场景 ⭐
      • 字符串命令练习⭐⭐
      • 过期时间设定 expire ⭐⭐⭐
        • 检查过期时间 ttl key
        • 删除过期key机制
          • 惰性删除
          • 定期删除

数据类型

数据类型丰富,字符串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

在这里插入图片描述
随着ttl命令的输入  过期时间不断减少

删除过期key机制

每个redis数据库中,都会有一个特殊的容器负责存储带有过期时间的ky以及它对应的过期时间,这个容器称之为“过期字典

针对过期字典中的key,redis结合惰性删除定期删除两大机制,有效删除过期数据

惰性删除

在 Redis 缓存系统中,可以使用惰性删除来处理过期的键,而不是在它们过期时立即删除,而是在下次访问时检查并删除。

在这里插入图片描述

定期删除

主动循环扫描检查

python 伪代码 redis C 语言编写的

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:禁入大多写命令

在这里插入图片描述


http://www.kler.cn/a/281394.html

相关文章:

  • Python画笔案例-019 绘制阴影丫字
  • nginx 负载均衡详解与实现方法案例
  • 16002.orin nano平台 linux gpio 学习记录
  • UniApp微信小程序登录实战指南
  • 掌握CSS的@import:跨文件样式的艺术
  • 【设计模式】组合模式和(宏)命令模式
  • LeetCode 热题100-36 二叉树的中序遍历
  • 采购订单抬头屏幕增加字段的增强实施步骤 (SMOD:MM06E005) <转载>
  • BeautifulSoup4通过lxml使用Xpath定位实例
  • linux文件——文件系统——文件系统深度理解、学习inode
  • fjfjfggjhgjgjjf
  • 集合及数据结构第十节(下)————常用接口介绍、堆的应用和java对象的比较
  • 基于Java的C语言课程教学实践小程序的设计与实现(论文+源码)_kaic
  • UE5如何为《黑神话:悟空》提供逼真的渲染效果?
  • DHU 二维数组 暗恋
  • Spring Cloud(面试篇)
  • Agent实际落地的应用 未来生活的无形助手
  • 2022SHBW(服务器部分)
  • 深度学习-OpenCV运用(2)
  • 记一次SQL注入漏洞获取管理员账号密码