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

Redis 使用记录

Redis服务器启动时根据redis.conf文件的中databases xx 配置创建多个数据库(默认配置是16),启动后默认使用的0号数据库,可用select dbnum 切换数据库。在redis集群模式下,只有0号数据库可用,是无法切换到其他库的。Redis服务器会将所有的数据库都保存在服务器状态的redisServer的db数组中,数组的每一项都代表了一个数据库,用redisDb结构来表示。

在client客户端状态中有一个db指针,指向server.db数组中的某项,代表当前客户端正在操作的数据库。通过切换client.db指针,调整客户端操作的数据库,这就是select命令的实现原理。

Redis 支持key-value键值对存储,dict 指针就指向了存储键值对的字典结构,key是字符串robj类型,value可以是任何的robj类型。当做新增、删除、更新或者查询的时候,就是根据输入的key在这个字典上做curd 操作。

Redis中的TTL

键值对的过期时间,可用expire key 命令设置键的过期时间,Redis有四个命令可设置过期时间:

expire key seconds 将key的生命周期设置为second秒;
pexpire key milliseconds 将key的生命周期设置为milliseconds毫秒;
expireat key timestamp 将key的过期时间设置在timestamp这个秒的时间戳过期;
pexpireat key timestamp 将key的过期时间设置在timestamp这个毫秒的时间戳过期;
上述命令最终经过转换都指向pexpireat

通过expires 指针指向了一个dict结构,字典中记录的就是所有键值对的过期时间。key是键值对的键,value是long类型的毫秒精度的unix时间戳,即过期的时间点。保存键值对的dict字典和保存过期时间的expires字典,key指针都指向相同的一个键字符串对象,内存上是不会存在浪费的。

redis通过惰性删除和定期删除两种策略实现对过期键的管理:

惰性删除:当程序访问到某个键值对的时候,会对过期时间检查,如果过期就删除,否则不处理。
定期删除:基于serverCron时间事件函数,从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中过期的键值对。

TTL用于设置生存时间,指定键的有效时间,当时间到达0时过期,redis会进行删除,但不是实时的,当过期的键被访问时会被删除或redis定时(默认100毫秒)超时检查删除。

持久化

rdb 持久化:save或者bgsave会检查键的过期时间,已过期的键不会保存到的持久化的rdb文件中。服务器启动载入rdb文件时,如果是主服务器,过期键会被忽略加载;如果是从服务器,不论是否过期,都会被加载。
aof 持久化:写入aof文件时,key是会写入的,过期之后,通过追加del命令,才会显示的删除此过期键。bgrewriteaof 重写时会检查键的过期时间,已过期的键不会写入新的aof文件中。
服务器启动载入aof文件时,过期键也会被忽略,不会被加载。

封装调用redis类

import redis
from conf.config import RedisConfig
class RedisConfig:redis_json = config_data['redis_config']redis_pwd = env.get('project_name').get('pwd')host = redis_json.get("host")dialog_states_db = redis_json.get("dialog_states_db")dialog_states_url = "redis://:{}@{}:{}".format(quote(redis_pwd), host, dialog_states_db)master_name = redis_json['master_name']class RedisClient:def __init__(self):self.client = redis.StrictRedis(host=RedisConfig.host, port=RedisConfig.port, db=RedisConfig.db, decode_responses=True, password=RedisConfig.redis_pwd)def set(self, key, value, ex=None):"""设置key-value:param key: 键名:param value: 要设置的值:param ex: 过期时间(秒)"""return self.client.set(name=key, value=value, ex=ex)def get(self, key):"""获取key-value:param key: 键名"""return self.client.get(name=key)def delete(self, key):"""删除key:param key: 键名"""return self.client.delete(key)def add_set(self, key, value):"""集合中存在该元素则返回0,不存在则添加进集合中,并返回1如果key不存在,则创建key集合,并添加元素进去,返回1"""return self.client.sadd(key, value)def is_inset(self, key, value):"""判断value是否在key集合中,返回布尔值"""return self.client.sismember(key, value)def exists(self, key):"""判断key是否存在:param key: 键名"""return self.client.exists(key)def incr(self, key, amount=1):"""递增:param key: 键名:param amount: 递增量"""return self.client.incr(name=key, amount=amount)def expire(self, key, time):"""设置过期时间:param key: 键名:param time: 生存时间(秒)"""return self.client.expire(name=key, time=time)def ttl(self, key):"""获取剩余存活时间:param key: 键名"""return self.client.ttl(name=key)def close(self):"""关闭连接"""self.client.close()

参考:

redis里TTL如果到0是不是就删除了_mob64ca12df9869的技术博客_51CTO博客

【Redis-05】Redis如何实现保存键值对的保存及过期键的管理策略_存储zset键值对 并给键值对设置过期时间-CSDN博客

Redis数据库——键过期时间_redis设置过期时间-CSDN博客


http://www.mrgr.cn/news/48533.html

相关文章:

  • 线性最小二乘法中矩阵不确定度估计
  • 如果某个特征缺失率达到70%左右,不能删除的情况下怎么处理合适?
  • GEE 高阶应用:eeExtra包(Python、R、julia和JavaScript API)
  • ✬绍兴IATF16949认证:✬推动企业✬可持续发展✬
  • 24最新新手入门指南:Stable Diffusion!
  • Overfrp内网穿透:使用域名将内网http/https服务暴露到公网
  • org.apache.commons.lang3.tuple.Pair
  • 超纲了!什么是溢出字段?InnoDB是如何识别普通字段和溢出字段的?(附十张图、IBD文件解析、源码解析)
  • 关于安科瑞ABAT蓄电池在线监测系统的详细介绍-安科瑞 蒋静
  • c++关于内存的知识点上速成
  • MySQL 【日期】函数大全(二)
  • 【android studio】Gradle和Gradle插件版本关系和配置示例
  • 远程监控控制器(RMC)系统详解
  • 使用3080ti配置安装blip2
  • 面试技术点
  • Anaconda常用命令分享
  • 【Codeforces】CF 2020 D
  • plpo vue实战版教程
  • OAuth2.1的code_challenge和code_vertifier理解
  • 五子棋项目自动化测试