文末有 demo 下载
Redis是一个开源的Key-Value存储,但又不仅仅是Key-Value存储,用官网上的话来说,Redis是一个数据结构存储,可用作数据库、缓存和消息中间件。相对于传统的Key-Value存储Memcached来说,Redis具有如下特点:
这是最简单的Redis类型。如果只使用这种类型,Redis就像一个可持久化的Memcached服务器。
Redis的List是基于双向链表实现的,可以支持反向查找和遍历。
常用案例:聊天系统、社交网络中获取用户最新发表的帖子、简单的消息队列、新闻的分页列表、博客的评论系统。
Hash是一个String类型的field和value之间的映射表,请见下图,类似于.NET中的Hashtable和Dictionary。主要用来存储对象,可以避免序列化的开销和并发修改控制的问题。
Set也是一个列表,不过它的特殊之处在于它是可以自动排重的:当需要存储一个列表数据,而又不希望出现重复的时候,Set是一个很好的选择(比如ID的集合)。并且Set提供了判断某个成员是否在一个Set集合内的接口,这也是List所没有的。
Sorted Set和Set的使用场景类似,区别是Sorted Set会根据提供的score参数来进行自动排序。当你需要一个有序的并且不重复的集合列表,那么就可以选择Sorted Set数据结构。常用案例:游戏中的排行榜。
以下特性请重点看管道和事务。
Redis管道是指客户端可以将多个命令一次性发送到服务器,然后由服务器一次性返回所有结果。管道技术在批量执行命令的时候可以大大减少网络传输的开销,提高性能。
Redis事务是一组命令的集合。一个事务中的命令要么都执行,要么都不执行。如果命令在运行期间出现错误,不会自动回滚。
管道与事务的区别:管道主要是网络上的优化,客户端缓冲一组命令,一次性发送到服务器端执行,但是并不能保证命令是在同一个事务里面执行;而事务是原子性的,可以确保命令执行的时候不会有来自其他客户端的命令插入到命令序列中。
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作,如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
从Redis 3.2版本开始,新增了地理信息相关的命令,可以将用户给定的地理位置信息(经纬度)存储起来,并对这些信息进行操作。
步骤1、在需要使用Redis的项目中引用FxCommon.dll和Redis.dll 。
步骤2、在App.config或web.config文件中添加如下配置:
- <add key="RedisServerIP" value="redis:uuid845tylabc123@139.198.13.12:4125"/>
- <!-- 提供的 Redis 环境是单机版配置。如果 Redis 是主从配置,则还需设置 RedisSlaveServerIP-->
- <!--<add key="RedisSlaveServerIP" value="redis:uuid845tylabc123@139.198.13.13:4125"/>-->
- <!--Redis 数据库。如果不需要指定 Redis 数据库,就配置默认值 0-->
- <add key="RedisDefaultDb" value="0"/>
步骤 3、使用 PooledRedisClientManager 类创建 Redis 连接池:
- // 读取 Redis 主机 IP 配置信息
- string[] redisMasterHosts = ConfigurationManager.ConnectionStrings["RedisServerIP"].ConnectionString.Split(',');
- // 如果 Redis 服务器是主从配置,那么还需要读取 Redis Slave 机的 IP 配置信息
- string[] redisSlaveHosts = null;
- var slaveConnection = ConfigurationManager.ConnectionStrings["RedisSlaveServerIP"];
- if (slaveConnection != null && !string.IsNullOrWhiteSpace(slaveConnection.ConnectionString))
- {
- string redisSlaveHostConfig = slaveConnection.ConnectionString;
- redisSlaveHosts = redisSlaveHostConfig.Split(',');
- }
- // 读取 RedisDefaultDb 配置
- int defaultDb = 0;
- string defaultDbSetting = ConfigurationManager.AppSettings["RedisDefaultDb"];
- if (!string.IsNullOrWhiteSpace(defaultDbSetting))
- {
- int.TryParse(defaultDbSetting, out defaultDb);
- }
- var redisClientManagerConfig = new RedisClientManagerConfig
- {
- MaxReadPoolSize = 50,
- MaxWritePoolSize = 50,
- DefaultDb = defaultDb
- };
- // 创建 Redis 连接池
- Manager = new PooledRedisClientManager(redisMasterHosts, redisSlaveHosts, redisClientManagerConfig)
- {
- PoolTimeout = 2000,
- ConnectTimeout = 500
- };
步骤4、通过PooledRedisClientManager的实例获取Redis客户端,然后就可以开始通过Redis客户端的API进行操作。
Redis Key命名规范:AppID:KeyName。
可能有很多人习惯用英文状态的点号来作为AppID和KeyName的分隔符,而笔者建议使用冒号作为AppID和KeyName的分隔符,其原因是:这么写会使Redis Key会以AppID作为分类显示在Redis Desktop Manager中,方便你能够快速查到要查阅的Redis Key对应的Redis Value值,请见下图:
但如果使用英文状态的点号来作为分隔符的话,那么在Redis Desktop Manager中,Redis Key就不会被分类了,请见下图:
本系列文章涉及内容清单如下,其中有感兴趣的,欢迎关注:
来源: https://juejin.im/entry/5a003862f265da430406042c