Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。
目录
一、在 centos7 上安装 redis
二、redis string 类型
三、redis list 类型
四、redis hash 类型
五、redis sortedset 类型
六、redis Subscribe 与 Publish
七、redis 数据迁移
准备条件
- 准备 redis 的安装源
- 准备 nuget 包:StackExchange.Redis
实战之路
一、在 centos7 上安装 redis
下载最新 Remi 的软件源
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
安装 redis
yum --enablerepo=remi install redis
启动 redis
systemctl start redis
设置 redis 开机启动
systemctl enable redis
二、redis string 类型
1、string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
以下是对 String 类型的所有操作方法。
原码地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs
2、在.netcore 中的调用。
var flag = redisManager.StringSet("dylan", "公众号为:sharecore");var value = redisManager.StringGet("dylan");Console.WriteLine($"获取缓存值为:{value}");
三、redis list 类型
1、Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
个人认为 list 是非常好用的一个类型,我们可以把 Redis 的 list 当成消息队列使用,比如向注册用户发送欢迎邮件的工作,可以在注册的流程中把要发送邮件的邮箱放到 list 中,另一个程序从 list 中 pop 获取邮件来发送。生产者、消费者模式。把生产过程和消费过程隔离。

List 类型的所有操作方法。
# List/// <summary>/// 移除指定 ListId 的内部 List 的值/// </summary>/// <param name="key"></param>/// <param name="value"></param>public void ListRemove<T>(string key, T value){key = AddSysCustomKey(key);Do(db => db.ListRemove(key, ConvertJson(value)));}/// <summary>/// 获取指定 key 的 List/// </summary>/// <param name="key"></param>/// <returns></returns>public List<T> ListRange<T>(string key){key = AddSysCustomKey(key);return Do(redis =>{var values = redis.ListRange(key);return ConvetList<T>(values);});}/// <summary>/// 入队/// </summary>/// <param name="key"></param>/// <param name="value"></param>public void ListRightPush<T>(string key, T value){key = AddSysCustomKey(key);Do(db => db.ListRightPush(key, ConvertJson(value)));}/// <summary>/// 出队/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public T ListRightPop<T>(string key){key = AddSysCustomKey(key);return Do(db =>{var value = db.ListRightPop(key);return ConvertObj<T>(value);});}/// <summary>/// 入栈/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <param name="value"></param>public void ListLeftPush<T>(string key, T value){key = AddSysCustomKey(key);Do(db => db.ListLeftPush(key, ConvertJson(value)));}/// <summary>/// 出栈/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public T ListLeftPop<T>(string key){key = AddSysCustomKey(key);return Do(db =>{var value = db.ListLeftPop(key);return ConvertObj<T>(value);});}/// <summary>/// 获取集合中的数量/// </summary>/// <param name="key"></param>/// <returns></returns>public long ListLength(string key){key = AddSysCustomKey(key);return Do(redis => redis.ListLength(key));}直接复制同步的方法,在方法外后面加上 Async 即可
2、在.netcore 中的调用。
入队:
redisManager.ListRightPush("dylan", "sharecore 我是入队的");//入队long len = redisManager.ListLength("dylan");//队列长度string b = redisManager.ListRightPop<string>("dylan");//出队
出队:
redisManager.ListLeftPush("dylan", "sharecore 我是入栈的");//入栈long len = redisManager.ListLength("dylan");//队列长度string b = redisManager.ListLeftPop<string>("key123");//出栈
四、redis hash 类型
1、Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
以下是对 Hash 类型的所有操作方法。
# Hash/// <summary>/// 判断某个数据是否已经被缓存/// </summary>/// <param name="key"></param>/// <param name="dataKey"></param>/// <returns></returns>public bool HashExists(string key, string dataKey){key = AddSysCustomKey(key);return Do(db => db.HashExists(key, dataKey));}/// <summary>/// 存储数据到 hash 表/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <param name="dataKey"></param>/// <param name="t"></param>/// <returns></returns>public bool HashSet<T>(string key, string dataKey, T t){key = AddSysCustomKey(key);return Do(db =>{string json = ConvertJson(t);return db.HashSet(key, dataKey, json);});}/// <summary>/// 移除 hash 中的某值/// </summary>/// <param name="key"></param>/// <param name="dataKey"></param>/// <returns></returns>public bool HashDelete(string key, string dataKey){key = AddSysCustomKey(key);return Do(db => db.HashDelete(key, dataKey));}/// <summary>/// 移除 hash 中的多个值/// </summary>/// <param name="key"></param>/// <param name="dataKeys"></param>/// <returns></returns>public long HashDelete(string key, List<RedisValue> dataKeys){key = AddSysCustomKey(key);//List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};return Do(db => db.HashDelete(key, dataKeys.ToArray()));}/// <summary>/// 从 hash 表获取数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <param name="dataKey"></param>/// <returns></returns>public T HashGet<T>(string key, string dataKey){key = AddSysCustomKey(key);return Do(db =>{string value = db.HashGet(key, dataKey);return ConvertObj<T>(value);});}/// <summary>/// 为数字增长 val/// </summary>/// <param name="key"></param>/// <param name="dataKey"></param>/// <param name="val">可以为负</param>/// <returns>增长后的值</returns>public double HashIncrement(string key, string dataKey, double val = 1){key = AddSysCustomKey(key);return Do(db => db.HashIncrement(key, dataKey, val));}/// <summary>/// 为数字减少 val/// </summary>/// <param name="key"></param>/// <param name="dataKey"></param>/// <param name="val">可以为负</param>/// <returns>减少后的值</returns>public double HashDecrement(string key, string dataKey, double val = 1){key = AddSysCustomKey(key);return Do(db => db.HashDecrement(key, dataKey, val));}/// <summary>/// 获取 hashkey 所有 Redis key/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public List<T> HashKeys<T>(string key){key = AddSysCustomKey(key);return Do(db =>{RedisValue[] values = db.HashKeys(key);return ConvetList<T>(values);});}/// <summary>////// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public List<T> HashValues<T>(string key){var result = new List<T>();key = AddSysCustomKey(key);return Do(db =>{HashEntry[] arr = db.HashGetAll(key);foreach (var item in arr){if (!item.Value.IsNullOrEmpty){result.Add(JsonConvert.DeserializeObject<T>(item.Value));}}return result;});}直接复制同步的方法,在方法外后面加上 Async 即可
2、在.netcore 中的调用。
var data = new{name = "dylan",code = "sharecore",};bool flag = redisManager.HashExists("dylan", "key1");if (!flag){redisManager.HashSet<object>("dylan", "key1", data);redisManager.HashSet<object>("dylan", "key2", data);}var value = redisManager.HashValues<QueueValue>("dylan");
五、redis sorted 类型
1、Redis zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
zset 的成员是唯一的,但分数(score)却可以重复。
以下是对 SortedSet 类型的所有操作方法。
原码地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs
2、在.netcore 中的调用
var data = new{name = "dylan",code = "sharecore",};redisManager.SortedSetAdd("dylan", data, 1.0);//添加redisManager.SortedSetRemove("dylan",data);//删除redisManager.SortedSetRangeByRank<QueueValue>("dylan");//获取全部redisManager.SortedSetLength("dylan");//获取数量
六、redis Subscribe 与 Publish
1、Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的通道。
以下是对 Subscribe 与 Publish 类型的所有操作方法。
# 发布订阅/// <summary>/// Redis 发布订阅 订阅/// </summary>/// <param name="subChannel"></param>/// <param name="handler"></param>public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null){ISubscriber sub = _conn.GetSubscriber();sub.Subscribe(subChannel, (channel, message) =>{if (handler == null){Console.WriteLine(subChannel + " 订阅收到消息:" + message);}else{handler(channel, message);}});}/// <summary>/// Redis 发布订阅 发布/// </summary>/// <typeparam name="T"></typeparam>/// <param name="channel"></param>/// <param name="msg"></param>/// <returns></returns>public long Publish<T>(string channel, T msg){ISubscriber sub = _conn.GetSubscriber();return sub.Publish(channel, ConvertJson(msg));}/// <summary>/// Redis 发布订阅 取消订阅/// </summary>/// <param name="channel"></param>public void Unsubscribe(string channel){ISubscriber sub = _conn.GetSubscriber();sub.Unsubscribe(channel);}/// <summary>/// Redis 发布订阅 取消全部订阅/// </summary>public void UnsubscribeAll(){ISubscriber sub = _conn.GetSubscriber();sub.UnsubscribeAll();}
2、在.netcore 中的调用
订阅:
redisManager.Subscribe("dylan", (channel, value) =>{Console.WriteLine(channel.ToString() + ":" + value.ToString());});
发布:
var data = new{name= "dylan",code = "sharecore"};redisManager.Publish("dylan", data);
注:如果在是控制台要一直在运行中。
六、redis 数据迁移
1.默认 redis 数据存放在/var/lib/redis

1.保存 redis 最新数据
[root@localhost ~]# redis-cli127.0.0.1:6379 > save127.0.0.1:6379 > quit #退出
3.将dump.rdb 传入到新服务器目录/var/lib/redis,重命名为 dump.rdb.back
接着进入目录,运行 ll 命令查看该目录下有一个 dump.rdb 文件,该文件就是 redis 数据备份文件:
[][]
将 dump.rdb 文件保存,传到新服务器/var/lib/redis 目录,重命名为 dump.rdb.back。(可以使用 FTP)
新服务器
连新服务器,进入到 redis 数据备份存放的目录:
[][]
可以看到此时目录下有一个 dump.rdb.back 文件,先进入 redis 命令行模式,关闭 redis:
[root@localhost ~]# redis-cli127.0.0.1:6379 > shutdown #关闭127.0.0.1:6379 > quit #退出
接着把 dump.rdb.back 复制为 dump.rdb:
[root@localhost redis]# cp dump.rdb.back dump.rdb
3、重启新服务器 redis 服务,完成
[root@localhost redis]# systemctl restart redis
总结
Memcached 只能当缓存服务器用,也是最合适的;Redis 不仅可以做缓存服务器(性能没有 Memcached 好),还可以存储业务复杂数据。






