Redis可以做哪些事儿?

本文介绍了Redis作为高效缓存服务器的功能,并展示了如何使用Redis实现轻量级消息队列(MQ),包括数据的入队、出队及与消息队列的消费过程。此外,提供了Redis驱动开发包的下载链接。

    Redis可以作为数据库,提供高速缓存,消息队列等功能,这里介绍Redis可以做的其中两件事:

  1.提供缓存功能,作为缓存服务器;

  2.轻量级的消息队列(MQ)进行使用.

 

 /// <summary>
    /// Redis帮助类
    /// </summary>
    public class RedisHelper
    {
        /// <summary>
        /// 往消息队列中放入数据
        /// </summary>
        /// <param name="listId">队列Id</param>
        /// <param name="value">数据</param>
        public static void Enqueue(string listId, string value)
        {
            using (IRedisClient client = RedisManager.ClientManager.GetClient())
            {
                client.EnqueueItemOnList(listId, value);
            }
            return;
        }

        /// <summary>
        /// 从消息队列中取出数据
        /// </summary>
        /// <param name="listId">队列Id</param>
        /// <returns></returns>
        public static string Dequeue(string listId)
        {
            using (IRedisClient client = RedisManager.ClientManager.GetClient())
            {
                return client.DequeueItemFromList(listId);
            }
        }

        /// <summary>
        /// 从消息队列中取出数据
        /// </summary>
        /// <param name="redisClient"></param>
        /// <param name="listId"></param>
        /// <returns></returns>
        public static string Dequeue(IRedisClient redisClient, string listId)
        {
            return redisClient.DequeueItemFromList(listId);
        }

        /// <summary>
        /// Redis写
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="cacheTime">缓存时间(分钟)</param>
        /// <returns></returns>
        public static bool Set<T>(string key, T value, int cacheTime = 0)
        {
            using (IRedisClient client = RedisManager.ClientManager.GetClient())
            {
                if (cacheTime <= 0)
                {
                    return client.Set<T>(key, value);
                }
                return client.Set<T>(key, value, DateTime.Now.AddMinutes(cacheTime));
            }
        }

        /// <summary>
        /// Redis读
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">键</param>
        /// <returns></returns>
        public static T Get<T>(string key)
        {
            using (IRedisClient client = RedisManager.ClientManager.GetClient())
            {
                return client.Get<T>(key);
            }
        }
    }

    /// <summary>
    /// Redis管理类
    /// </summary>
    public class RedisManager
    {
        public static PooledRedisClientManager ClientManager { get; private set; }
        static RedisManager()
        {
            RedisClientManagerConfig redisConfig = new RedisClientManagerConfig();
            redisConfig.MaxWritePoolSize = 128;
            redisConfig.MaxReadPoolSize = 128;
            ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" }, new string[] { "127.0.0.1" }, redisConfig);
        }
    }

  

消息队列数据消费方示例代码:

 JavaScriptSerializer serializer = new JavaScriptSerializer();
            //数据消费者
            while (true)
            {
                string data = RedisHelper.Dequeue("sendActiveEmail");
                if (data != null)
                {
                    EmailModel emailModel = (EmailModel)serializer.Deserialize(data, typeof(EmailModel));
                    Console.WriteLine("发送邮件:" + emailModel.MailTo);
                    CommonHelper.SendEmail(emailModel.MailTo, emailModel.Subject, emailModel.Body, true);
                    Console.WriteLine("发送邮件完成");
                }
                else
                {
                    Thread.Sleep(500);
                }
            }

  

附:

Redis驱动开发包(.dll):

 

转载于:https://www.cnblogs.com/miaosha5s/p/5371347.html

### 分布式锁设计中的关键因素 在实现分布式锁的过程中,需要综合考虑多个方面以确保其安全性、可靠性和高效性。以下是几个重要的设计考量因素: #### 1. **高可用性** 为了保证分布式系统的正常运行,分布式锁服务本身也需要具备高可用性。这意味着即使部分节点发生故障,整个系统仍然能够继续提供锁定功能[^1]。 #### 2. **一致性保障** 分布式锁的核心目标之一是在多实例环境下维护数据的一致性。因此,在设计时需特别关注如何防止竞态条件的发生,并确保同一时间只有一个客户端能持有锁[^3]。 #### 3. **死锁预防机制** 当某个进程获得了一把锁却因崩溃或其他原因无法释放它时,可能会引发死锁现象。为了避免这种情况,通常会在创建锁时设置超时时间(TTL),一旦超过该期限而未被续期,则自动解锁[^2]。 #### 4. **网络分区容忍度** 考虑到实际生产环境中可能存在短暂或长期的网络分割状况,所选用的技术方案应具有良好的应对能力——即在网络恢复正常连接之后仍可正确同步状态并解除冲突性的加锁请求[^1]。 ### 最佳实践建议 针对上述提到的各项挑战,这里给出一些具体可行的最佳法来优化您的分布式锁解决方案: - 使用带有TTL参数的方法去申请资源占用权限(如redis setnx命令配合expire指令)[^2]; - 对于任何可能影响到最终结果的操作序列,务必采用务方式执行或者编写lua脚本来一次性完成多项子任务从而达到原子化效果[^3]; - 定义清晰合理的重试逻辑以便处理那些由于瞬时错误而导致失败的情况; - 如果项目允许的话优先选择像zookeeper这样专门构建用于协调工作的工具而不是单纯依赖内存型key-value存储引擎来这件事儿因为前者天然支持更复杂的语义模型比如临时节点等等特性有助于简化开发难度同时也提高了整体健壮程度[^2]. ```python import redis from time import sleep def acquire_lock(conn: redis.Redis, lock_name, acquire_timeout=10): identifier = str(uuid.uuid4()) end = time.time() + acquire_timeout while time.time() < end: if conn.set(lock_name, identifier, nx=True, ex=acquire_timeout): # 设置NX选项确保只有不存在时才新增键;EX指定过期秒数 return identifier sleep(.001) return False def release_lock(conn: redis.Redis, lock_name, identifier): pipe = conn.pipeline(True) while True: try: pipe.watch(lock_name) # 开始监视给定keys的变化情况直到下一次multi调用之前都不会触发其他修改动作 if pipe.get(lock_name) == identifier:# 只有当前线程持有的id匹配才能真正移除对应的lock记录 pipe.multi() pipe.delete(lock_name) pipe.execute() return True except redis.WatchError: # 若期间发生了改变则重新尝试直至成功为止 pass ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值