.net core redis的全套操作
发布于 1 个月前 作者 yan 73 次浏览

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类型的所有操作方法。

#region List 
 


 
       #region 同步方法 
 


 
       /// <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)); 
 
       } 
 


 
       #endregion 同步方法 
 


 
       #region 异步方法 
 
       直接复制同步的方法,在方法外后面加上Async即可 
 
       #endregion 异步方法 
 


 
       #endregion List 

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类型的所有操作方法。

#region Hash 
 


 
       #region 同步方法 
 


 
       /// <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; 
 
           }); 
 
       } 
 


 
       #endregion 同步方法 
 


 
        #region 异步方法 
 
       直接复制同步的方法,在方法外后面加上Async即可 
 
       #endregion 异步方法 
 


 
       #endregion Hash 

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类型的所有操作方法。

#region 发布订阅 
 


 
       /// <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(); 
 
       } 
 


 
       #endregion 发布订阅 

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](/user/localhost) ~]# redis-cli 
 
127.0.0.1:6379 > save  
 
127.0.0.1:6379 > quit #退出 

3.将dump.rdb传入到新服务器目录/var/lib/redis,重命名为dump.rdb.back

接着进入目录,运行ll命令查看该目录下有一个dump.rdb文件,该文件就是redis数据备份文件:

[root[@localhost](/user/localhost) ~]# cd /var/lib/redis 
 
[root[@localhost](/user/localhost) redis]# ll 

将dump.rdb文件保存,传到新服务器/var/lib/redis目录,重命名为dump.rdb.back。(可以使用FTP)

** **

新服务器

连新服务器,进入到redis数据备份存放的目录:

[root[@localhost](/user/localhost) ~]# cd /var/lib/redis 
 
[root[@localhost](/user/localhost) redis]# ll 

可以看到此时目录下有一个dump.rdb.back文件,先进入redis命令行模式,关闭redis:

[root[@localhost](/user/localhost) ~]# redis-cli 
 
127.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好),还可以存储业务复杂数据。

回到顶部