c# redis hashid如何设置过期时间_Redis内存管理:配置与版本事项

本文介绍了Redis配置与版本注意事项。包括配置Redis时内存相关指令,如rdbchecksum、activerehashing、slave - of等;说明了为键设置过期时间可防止内存溢出及相关操作;对比了32位和64位Redis在不同数据类型下的内存使用差异,并指出32位版本的注意事项。
1763919c19c13af0bf7895e79618dbd2.png

这一节我们先简单聊一下redis配置与版本注意事项,涉及到配置,键的过期、32位redis和64位的区别,后续我们再来了解Redis LRU键的驱逐策略以及具体的优化策略。

1、配置redis

bb6b86fde5f8a11bec5c3ef654769f3b.png

如果要运行一个高效的redis,我们必须要理解redis.conf文件中所有的内存相关指令,当然redis.conf文件提供了丰富内联文档使我们可以更好的理解、更改和测试相关配置项,本节我们先简单回顾用来配置redis的内存相关的指令,这些都可以在redis.conf文件中进行设置,在运行时我们可以通过CONFIG SET指令来设置。

  • rdbchecksum:默认值为Yes,将一个65位的冗余检验码(CRC64)放在RDB快照文件的尾末(RDB是redis持久化文件的一种,请参考面试官问:Redis数据丢失咋办?如何持久化它?),以此来发防止文件损坏,当redis开启子进程将数据持久化到RDB快照文件时,而我们需要注意的是对快照文件进行CRC64校验会增加10%的内存使用。
  • activerehashing:如果设置为yes,那么redis会在每隔100毫秒会重新哈希,重新哈希会是释放已经删除的键所占用的内存空间,如果对redis服务器没有指定硬性响应时间,建议设置为no,从而及时释放内存,说白设置为no可以提高响应速率,但内存占用较大,设置为yes后及时释放了内存空间,但遇到高并发量的客户端时可能降低了响应时间。
  • slave-of:主从复制可以提高可伸缩性,如果你的redis运行在集群环境中我们可以通过slave-of指令将redis切换到从模式,这是该从实例可以从另一个被指定为主实例的redis中复制数据,主从模式下提升redis的冗余度是在内存、硬件和网络IO之间做出的权衡。

2、键过期

763ee4c0d5d2578cd7cd8f2062f1200c.png

保证redis数据库不会内存溢出简单有可靠的方法是为键设置过期时间,有了过期时间键会自动被驱逐,为你应用程序设计一套高效的过期策略可以使你的内存需求更高效可控,我们需要注意的是一旦在键上调用EXPIRE命令来设置过期时间,该超时只能通过删除或替换键的方式清除,任何改变值的操作都不能清除该设置的超时:

redis>SET  myname  aa #设置一个key为myname的键okredis>EXPIRE  myname 300 #过期时间设为300秒(integer) 1redis>TTL myname #检测一下过期时间(integer) 287redis>APPEND myname pp #使用append命令追加值(integer) 4redis>GET myname #查看新值"aapp"redis>TTL myname  #再次检测一下过期时间"259"

可以看到值被修改后超时依然存在,如果需要清除这个超时设置可以在这个键上调用setgetset命令,ttl返回-1表示没有设置超时时间的默认值:

redis> TTL myname #检测过期时间(integer) 200redis> SET myname cc #set命令okredis> TTL myname  #再次检测过期时间 值为-1(integer) -1redis>persist myname  #也可以使用persist命令来清除键的过期时间:(integer)  1redis>persist myname  #也可以使用persist命令来清除键的过期时间:(integer)  1

需要注意的是如果对一个键设了过期时间,但此时数据库进程被关闭了,在redis重启之后会自动驱逐该键值。

3、32位的redis

对于小于3GB数据集情况下,在32位redis实例中要比64为版本小、这里我们来看两个redis实例:redisIns32,redisIns64,然后在python命令行创建测试函数,分别对每个实例设置10000个键值对:

>>> def myrRedisTest():  for i  in range(10000):    key = "uuid:{}".format(i)    value=uuid.uuid4()    redisIns32.set(key,value)    redisIns64.set(key,value)>>>def myrRedisTest()

再来看下redis中使用INFO memory查看内存使用情况:

#32位redis实例输出redis>INFO memory ...used_memory_human:11.87M #redis分配的内存大小used_peak_human:11.87M #redis使用峰值内存...#64位redis实例输出redis>INFO memory ...used_memory_human:14.18M #redis分配的内存大小used_peak_human:14.18M #redis使用峰值内存...

我们看到了相同的数据32位实例和64位实例的内部占用差异,下面我们列举一百万个整数、浮点数、字符串、哈希结构以及列表使用的内存对比

整数、浮点数、字符串的测试对比:

5a61be758e3576930f2579dc594cb79e.png

一百万个整数、浮点数、字符串redis使用版本比较

  • 图中显示如果使用整数,64位redis多使用了36%的内存,只要redis总使用内存不超过4GB,那32位版本的redis节省的内存也是很可观了。
  • 对于大量使用集合字符串的应用来说,显然64位版本的redis多出的内存不太明显,仅仅多了22%,并且64位版本的redis对字符串有大量的额外空间和编码优化,所以推荐使用64位版本。

哈希结构对比:

46f3daf6c602d9143ea7af8adec51b5c.png

哈希数据结构内存使用对比

对于哈希结构来说,无论存储什么类型,32位和64位之间差异都是基本定在了19-19.56之间。

列表结构对比

1e4c05d719cc95488032eacefc9da68a.png

列表数据结构的内存使用对比

可以看到在32位限制之下,列表非常适合存储整数和浮点数,字符串在32位和64位之间的内存使用率差异最小。

32位版本redis的注意事项

  • 由于32位版本的redis并未在用户群中广发部署和测试,较于64位版本来说可能有未发现的bug。
  • 诸如BITOP和BITCOUNT的位操作、字符串都在64位版本上做了优化。
  • 如果redis配置中参数maxmemory值设置的过于接近4GB,那么redis在通信、复制、IO缓存都有可能阻塞甚至崩溃。

个人理解有所纰漏,还请老铁们多多指教,下一节我们来讲解【Redis LRU键的驱逐策略】后续持续更新!

<think>好的,用户想知道在C#中如何为Redis设置过期时间。我之前看过一些关于Redis设置过期时间的资料,比如使用EXPIRE命令或者在SET命令中直接指定过期时间。现在需要将这些知识应用到C#中。 首先,用户提到的是C#,所以需要考虑使用哪个Redis客户端库。常见的库有StackExchange.Redis和ServiceStack.Redis。这里可能需要确认用户使用的是哪一个,但通常StackExchange.Redis比较流行,所以优先考虑这个库的示例。 接下来,设置过期时间的方法有两种:一种是在设置键的同时指定过期时间,另一种是设置键之后单独设置过期时间。对应的Redis命令是SET和EXPIRE。在C#中,StackExchange.Redis的StringSet方法有参数可以设置过期时间,比如absoluteExpiration或expiry。另外,也可以使用KeyExpire方法来单独设置。 然后需要编写示例代码,确保语法正确,比如正确使用Async方法,传递TimeSpan参数。例如,StringSetAsync的第三个参数是expiry,可以传入TimeSpan.FromSeconds(10)。而KeyExpireAsync则需要键名和TimeSpan。 另外,需要注意引用的来源。用户提供的引用中有三个相关的引用,其中引用[1]提到了使用SET和EXPIRE命令,引用[2]讨论了字符串类型的过期时间,引用[3]提到了过期时间和淘汰策略。在回答中应该自然地引用这些内容,比如在说明设置过期时间时引用[1]和[3]。 可能还需要考虑异常处理,比如检查连接是否正常,或者处理可能的Redis执行异常,但用户可能只需要基础示例,所以这部分可以暂时省略,保持代码简洁。 最后,生成相关问题时要围绕用户的问题扩展,比如如何检查剩余时间、批量设置过期时间、过期事件处理以及持久化对过期时间的影响。这些问题可以帮助用户进一步了解Redis的过期机制。 总结步骤: 1. 引入StackExchange.Redis库。 2. 连接Redis数据库。 3. 使用StringSetAsync设置键值并指定过期时间。 4. 使用KeyExpireAsync为已存在的键设置过期时间。 5. 添加相关引用到步骤中。 6. 生成相关问题,覆盖用户可能感兴趣的扩展话题。</think>### 如何在 C# 中为 Redis设置过期时间C# 中操作 Redis 设置键的过期时间,通常使用 `StackExchange.Redis` 库。以下是具体实现步骤和示例代码: --- #### 1. 安装依赖库 首先通过 NuGet 安装 `StackExchange.Redis`: ```bash Install-Package StackExchange.Redis ``` --- #### 2. 连接 Redis 数据库 ```csharp using StackExchange.Redis; // 创建连接 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); IDatabase db = redis.GetDatabase(); ``` --- #### 3. 设置键值并指定过期时间 ##### 方法一:在设置值时直接指定过期时间 ```csharp // 设置键值,并设置过期时间为 10 秒 await db.StringSetAsync("mykey", "Hello, Redis!", TimeSpan.FromSeconds(10)); ``` 此方法通过 `StringSetAsync` 的第三个参数 `expiry` 直接指定过期时间,对应 Redis 的 `SET key value EX seconds` 命令[^1][^2]。 --- ##### 方法二:为已存在的键设置过期时间 ```csharp // 先设置键值(不带过期时间) await db.StringSetAsync("mykey", "Hello, Redis!"); // 单独设置过期时间为 10 秒 await db.KeyExpireAsync("mykey", TimeSpan.FromSeconds(10)); ``` 使用 `KeyExpireAsync` 方法为已存在的键追加过期时间,对应 Redis 的 `EXPIRE` 命令[^1][^3]。 --- #### 4. 验证过期时间 ```csharp // 获取剩余生存时间(秒) TimeSpan? ttl = await db.KeyTimeToLiveAsync("mykey"); Console.WriteLine($"剩余生存时间:{ttl?.TotalSeconds ?? -1} 秒"); ``` --- #### 关键点说明 - **过期时间的单位**:C# 中使用 `TimeSpan` 类型(如 `TimeSpan.FromMinutes(5)`),Redis 内部以毫秒精度存储。 - **持久化影响**:若 Redis 配置了持久化(如 RDB/AOF),过期时间会在重启后依然生效[^3]。 - **淘汰策略**:若内存不足,Redis 会根据配置的淘汰策略(如 `volatile-ttl`)自动删除过期键[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值