Redis几个基本的全局指令

目录

1.set和get

2.keys

3.exists

4.del

5.expire

6.ttl

7.type


我们都知道Redis存的内容都是键值对,key是String,value有很多类型,像string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).....,这些结构是比较常见的,还有其他的类型,可以前往官方网站查看。

1.set O(1)和get O(1)

        set指令就是新建一个键值对,要确定键和值的内容,如果键已经存在,也会覆盖先前的键和值的内容;

        set key1 value1,就是新建一个键值对,键的内容是key1,值的内容是value1;

        

        get 就是获取键对于的value的值,比如get key1 ,就会返回key1对应的值的内容value1;

        

2.keys  O(N)

        keys 是按照表达式去匹配符合表达式的所有的键,我会先创建几个键值对,作为演示,hallo-hallo、hbllo-hbllo、hcllo-hcllo、hdllo-hdllo、hello-hello,主要认识两个特殊的符号,* 表示可以代替很多个字符(包括0个),?是占位符,只能代替一个字符;

        (这是一个危险指令,如果你有很多个键值对,建议不要使用)那我想要查找所有的键值对就可以用  keys *,输入这个指令就会返回所有的键值对的键,这个操作相当危险,如果你只有几个键值对,可以试一下,但是在工作中千万不要使用,是一个相当危险的操作,可能会使得redis服务器直接崩溃。

        

        keys h?llo,?只会代替一个字符

        

        keys h*llo,为了演示效果,我新增一个haaaaallo-haaaaallo;

        

        keys h[ab]llo

        

        keys h[^b]llo

        

        keys h[a-d]llo

        

3.exists O(1)

        单看exists就已经很清楚了,就是去判断键是否存在, exists hallo [hallo hbllo ...],可以一次性判断一个或者多个键是否存在,返回存在的键的个数;

        

4.del O(1)

        del 就是删除指定键的键值对,可以一次性删除一个或者多个,返回删除成功的个数

        

        一般你轻易删除redis中的键值对,如果只是作为缓存的数据,删除一个两个的影响不大,最多就是去数据库再查一次,但是如果redis是作为数据库在存数据的,那就删相当于是删除数据库的数据了;

5.expire O(1)

        为键值对添加秒级的过期时间 expire key time,有效时间内就可以获取得到该键值对,一旦过期就获取不到了;

        

6.ttl O(1)

        查看指定键的键值对的有效时间(秒级),有过期时间就返回具体的秒数,表示还有多少秒过期,没有过期时间就返回-1,键值对不存在就返回-2;

        

7.type O(1)

        返回键值对的值的数据内容

        

        这些指令并不需要刻意的背诵,只要多多练习,多打几遍,自然就记住了

<think>好的,我现在需要帮助用户解决如何在Redis中设置50小时后过期的expire指令的问题。首先,用户已经提供了几个相关的引用内容,我需要仔细阅读这些引用,并结合之前的回答来给出准确的解决方案。 首先,用户的问题很明确:如何在Redis中使用expire指令设置50小时的过期时间。根据引用[4]中的信息,Redis的expire命令接受秒作为单位,而pexpire则是毫秒。所以用户需要将50小时转换成秒,然后使用expire命令。 接下来,我需要确认用户是否了解如何转换时间单位。50小时乘以60分钟每小时,再乘以60秒每分钟,得到总秒数。即50*60*60=180000秒。这样用户就可以使用EXPIRE key 180000来设置过期时间。 然后,考虑到用户可能对不同的命令不太熟悉,需要解释EXPIREPEXPIRE的区别。引用[4]提到EXPIRE的单位是秒,PEXPIRE是毫秒,所以如果用户想用PEXPIRE的话,需要将50小时转换为毫秒,即50*60*60*1000=180000000毫秒,对应的命令是PEXPIRE key 180000000。 用户提供的引用中提到,如果没有设置过期时间,Redis会根据maxmemory-policy来处理,比如volatile-lru会删除有过期时间的key,而noeviction则不会删除未设置过期时间的key。不过用户的问题是关于设置过期时间,所以这部分可能暂时不需要深入,但可以作为补充信息,提醒用户如果忘记设置过期时间可能带来的影响。 另外,用户可能关心如何验证过期时间是否设置成功。这时候需要介绍TTLPTTL命令,分别用于查看剩余的秒数毫秒数。例如,TTL key返回剩余时间,如果返回-2表示key不存在,-1表示未设置过期时间,其他正数则是剩余秒数。 用户可能还想知道在Java中如何通过Spring Data Redis来操作,比如使用RedisTemplate。这时候可以给出示例代码,说明如何设置值过期时间。比如: redisTemplate.opsForValue().set("myKey", "value", 180000, TimeUnit.SECONDS); 或者分开设置值过期时间: redisTemplate.opsForValue().set("myKey", "value"); redisTemplate.expire("myKey", 180000, TimeUnit.SECONDS); 同时,可以提到在Spring Boot中可能更倾向于使用注解方式,比如@Cacheable,但需要配置CacheManager来指定过期时间。 还需要注意一些常见问题,比如时间单位错误,或者服务器时区问题。例如,确保使用正确的单位,秒而不是毫秒,否则会导致过期时间过长或过短。另外,服务器时区不一致可能导致实际过期时间与预期不符,但Redis内部使用的时间戳是基于服务器的,所以需要确保服务器时间准确。 用户可能对持久化有疑问,比如RDBAOF对过期key的处理。不过根据引用[3],当Redis内存达到maxmemory时,会根据策略删除key,但用户的问题主要是设置过期时间,所以这部分可能不需要详细展开,除非用户进一步提问。 总结步骤:转换时间单位,使用EXPIRE或PEXPIRE命令,验证设置,处理Java中的实现,注意常见错误点。这样用户就能全面了解如何设置50小时的过期时间,以及相关的注意事项。</think>#### Redis设置50小时过期时间的完整实现方案 根据Redis官方文档实际开发经验,设置50小时过期时间的具体操作如下: #### 一、时间单位换算 1. **基础换算公式** $50\ 小时 \times 60\ 分钟/小时 \times 60\ 秒/分钟 = 180,000\ 秒$ $50\ 小时 \times 60\ 分钟/小时 \times 60\ 秒/分钟 \times 1000\ 毫秒/秒 = 180,000,000\ 毫秒$ #### 二、Redis命令行操作 1. **秒级精度设置(推荐)** ```bash EXPIRE your_key 180000 # 设置50小时(180,000秒)后过期[^4] ``` 2. **毫秒级精度设置** ```bash PEXPIRE your_key 180000000 # 设置50小时(180,000,000毫秒)后过期[^4] ``` #### 三、Java客户端实现(Spring Data Redis) 1. **原生Jedis方式** ```java Jedis jedis = new Jedis("localhost"); // 设置值并指定过期时间 jedis.setex("your_key", 180000, "your_value"); ``` 2. **Spring Boot集成方式** ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void setKeyWithExpire() { // 方法一:设置值同时指定过期时间 redisTemplate.opsForValue().set("your_key", "your_value", 180000, TimeUnit.SECONDS); // 方法二:单独设置过期时间 redisTemplate.opsForValue().set("your_key", "your_value"); redisTemplate.expire("your_key", 180000, TimeUnit.SECONDS); } ``` #### 四、过期时间验证方法 1. **查看剩余生存时间** ```bash TTL your_key # 返回剩余秒数(-2表示已过期,-1表示永不过期) PTTL your_key # 返回剩余毫秒数[^4] ``` #### 五、注意事项 1. **时钟同步问题** Redis服务器必须启用NTP时间同步服务,避免因时钟漂移导致过期时间计算错误[^1] 2. **持久化影响** 在RDB持久化模式下,已过期的键不会保存到快照文件 在AOF持久化模式下,过期操作会记录为DEL命令[^3] 3. **内存回收策略** 当内存达到maxmemory时,即使未到期也可能被LRU策略删除(需配置volatile-lru策略)[^3] #### 六、最佳实践建议 1. **设置过期时间的三种方式对比** | 方式 | 精度 | 适用场景 | 示例命令 | |--------------------|-------|---------------------------|--------------------------| | EXPIRE | 秒级 | 常规业务场景 | EXPIRE order:123 180000 | | EXPIREAT | 秒级 | 固定时间点过期 | EXPIREAT order:123 1893456000 | | PEXPIRE/PEXPIREAT | 毫秒级 | 高精度定时任务 | PEXPIRE session:abc 180000000 | 2. **Spring Boot注解式配置** ```java @Configuration @EnableCaching public class RedisConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(50)) // 全局默认50小时过期 .disableCachingNullValues(); return RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); } } ``` 3. **异常处理建议** ```java try { redisTemplate.expire(key, 180000, TimeUnit.SECONDS); } catch (RedisSystemException e) { log.error("设置过期时间失败,key:{}", key, e); // 降级处理:记录日志并异步重试 retryExecutor.execute(() -> retrySetExpire(key)); } ``` #### 七、常见问题排查 1. **过期时间未生效的检查清单** - 确认Redis版本是否支持相关命令(EXPIRE从1.0开始支持) - 检查是否配置了`maxmemory-policy=noeviction`(该策略会阻止自动删除)[^3] - 使用`OBJECT IDLETIME key`命令验证键空闲时间 - 监控Redis日志是否出现`WARNING overcommit_memory is set to 0!`提示 2. **时区不一致解决方案** ```bash # 查看Redis服务器时间 redis-cli TIME # 设置服务器时区(需root权限) timedatectl set-timezone Asia/Shanghai ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

a添砖Java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值