Asp.NET Core下使用StackExchange.Redis操作Redis

作者 the7
发布于 2020年01月13日
评论 0
浏览 381

Redis是一个开源的key-value存储系统,和Memcached类似,但覆盖了Memcached的绝大部分功能。Redis数据都在内存中,除了支持简单的key-value模式,还支持string list set zset hash等五种数据结构。同时Redis还支持数据持久化、读写分离、集群等功能。

Redis官网 https://redis.io

安装StackExchange.Redis

PM> Install-Package StackExchange.Redis

StackExchange.Redis官方文档 https://stackexchange.github.io/StackExchange.Redis/

键操作

key的数量最多可以为2的32次方。大小最大可以为512mb。

//键是否存在
db.KeyExists("k1");

//类型,返回RedisType枚举
var keyType = db.KeyType("k1");

//删除键
db.KeyDelete("k1");

//设置键过期时间,比如10秒后过期,如果重新设置了k1,时间将变成永不过期
db.KeyExpire("k1", TimeSpan.FromSeconds(10));


//查看键还剩多少时间过期 纯ttl命令 -1表示永不过期 -2表示已过期
//但这里 1.键不存在  2.已过期 3.永不过期 都为null。注意判断
var ttl = db.KeyTimeToLive("k1");

如何执行flushdb等命令

在redis端 ,我们可以使用 keys * 、flushdb 等命令,那么在StackExchange.Redis又如何使用呢。代码如下

var server = multiplexer.GetServer("localhost:6379");
server.Keys(pattern:"*");
server.Keys(pattern:"*[1-9]");
server.Keys(pattern:"?[1-9]");//问号代表一个字符
server.FlushDatabase();

String

String是Redis最基本的类型,一个key对应一个value。String类型是二进制安全的,可以包含任何数据,比如图片或者序列化对象,但也不能太大,最多可以是512MB。

//存,如果key一样,就覆盖
db.StringSet("k2", "v2");
db.StringSet("k2", "v22");

//取
db.StringGet("k2");

//追加,如果key不存在就创建,返回追加后的value长度
db.StringAppend("k5", "11");

//获取value长度
db.StringLength("k2");

//不存在时才设置,相当于命令模式下的 setnx
db.StringSet("k6", "v6", when: When.NotExists);

//数字增加
//如果键不存在,创建key,在0基础上做加减。
db.StringSet("k10", 10);
db.StringIncrement("k10", 5);

//数字减少
db.StringSet("k10", 10);
db.StringDecrement("k15", 5);

//多个kv一起存
var kvs = new[]
{
new KeyValuePair<RedisKey, RedisValue>("k1","v1"),
new KeyValuePair<RedisKey, RedisValue>("k2","v2"),
};
db.StringSet(kvs);

//获得值的范围,类似SubString
db.StringGetRange("k10", 0, 2);

//覆盖指定范围的值
db.StringSetRange("k10", 0, "v10");

//设置新值获取旧值
var v1 = db.StringGetSet("k1", "v2");

List

单键多值,Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部或者尾部,它的底层是个双向链表,对两端的操作性能很高,通过索引操作性能稍差。list可包含重复值。

//从左边推入
db.ListLeftPush("l1", "v1");

//从右边推入
db.ListRightPush("l1", "v2");

//左边弹出
var lv1 = db.ListLeftPop("l1");

//右边弹出
var lv2 = db.ListRightPop("l1");

//如果弹完,键就被自动删除。所谓键在值在,值光键亡。

//右边弹出 左边推入
var ss = db.ListRightPopLeftPush("l1", "l2");

//按范围获取,stop如果为-1,就是取全部,表示倒数第一个。
db.ListRange("l1", 0, 10);

//按索引获取
db.ListGetByIndex("l1", 10);

//获取字符串个数
db.ListLength("l1");

//在中间插入值
db.ListInsertAfter("l1", 5, "v1");

//删除n个value.
//n取值正数,从左边删除n个value
//取值为负数,从右边删除n个value
//取值为0 ,删除全部value
db.ListRemove("s1", "v1",1);

SET 集合

SET类似list,是一个无序集合,可以自动排重,复杂度O(1),常用操作方法如下。

//添加
db.SetAdd("s1", "v1");
db.SetAdd("s1", new RedisValue[] {1, 2, 3});
db.SetAdd("s1", 3);//再添加一个重复项,其实s1集合里还是4个元素,说明是排重的

//取出集合所有元素
var s1 = db.SetMembers("s1");

//集合是否包含某元素
var isMemberOfS1 = db.SetContains("s2", 5); 

//集合元素个数
var count = db.SetLength("s1");

//删掉一个元素
var rmIsSuccessful = db.SetRemove("s1", 3);

//随机弹出一个元素,元素会从集合中删除
//如果全部元素都弹出,s1这个key也会被删除
var item = db.SetPop("s1");

//随机取出一个元素,元素不会从集合中删除
var item1 = db.SetRandomMember("s1");

//随机取N个元素
var items = db.SetRandomMembers("s1", 3);

//取交集
var combineResult = db.SetCombine(SetOperation.Intersect, "s1", "s2");

//取并集
var combineResult1 = db.SetCombine(SetOperation.Union, "s1", "s2");

//取差集
var combineResult2 = db.SetCombine(SetOperation.Difference, "s1", "s2");

HASH

HASH是一个键值对集合,实质上是一个string类型的field和value的映射表,适合存储对象,类似 c# 中的 Dictionary<string,object>。通过 key(用户ID)+field(属性标签)就可以操作对应属性数据,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。常用操作如下。

//准备一个对象
var student = new Student()
{
  Id = 1,
  Age = 120,
  Birthday = DateTime.Now.AddYears(-20),
  Name = "周星驰"
};

//存
db.HashSet("person", student.ConvertToHashEntryList().ToArray());
db.HashSet("person", "Age", "20"); //覆盖

//取, 注意hashField的大小写
var age = db.HashGet("person", "Age");


//是否存在
var hashExists = db.HashExists("person","Age");

//取出所有field 和 value
var hashGetAll = db.HashGetAll("person");

//将hash值转为对象
var student1 = hashGetAll.ConvertFromHashEntryList<Student>();

//获取所有value
var hashValues = db.HashValues("person");

//获取所有field
var hashKeys = db.HashKeys("person");

//获取field数量
var hashLength = db.HashLength("person");

//增加某字段的值
db.HashIncrement("person", "Age", 10);

//删除某field
     
db.HashDelete("person", "Age");

ZSET

ZSET(SORTED SET)与普通集合SET非常相似,是一个没有重复元素的字符串集合,不同之处是ZSET都关联一个评分 SCORE,这个评分值可以重复。

//添加
db.SortedSetAdd("z1", "v1", 100);

//按分数获取范围值
db.SortedSetRangeByScore("z1", 130, 150);

//查看v1的排名
db.SortedSetRank("s1", "v1");

事务操作

var newId = "xxx";
var tran = db.CreateTransaction();
tran.AddCondition(Condition.HashNotExists("k1", "unqid"));
tran.HashSetAsync("k1", "unqid", newId);
var committed = tran.Execute();

0条评论

请先登录后发表评论
提交评论
标签云
css (1) less calc (1) C# (4) C#进制转换 (1) asp.net core (8) Authentication (1) 注销 (1) 登录 (1) 验证 (1) scroll-view (1) 微信小程序 (4) 滚动到底部 (1) StackExchange.Redis (1) google (1) 百度 (1) nginx (2) 大文件 (2) 微信小程序c#解密 (1) 微信小程序获取手机号 (1) openid (1) session_key (1) CDN (1) URL鉴权 (1) 阿里云 (1) async (1) await (1) 禁止下拉上滑效果 (1) Index类型 (1) Range类型 (1) dontent publish (1) dotnet publish在线生成器 (1) System.DrawingCore.GDIPlus报错 (1) centos (1) 中文字体 (1) SqlBulkCopy (1) SqlSugar (1) JWT (5) 认证 (3) RSA JWT (1) 非对称加密 (1) 写信 (1) 见字如面 (1) 优化建议 (2) 正确操作字符串 (1) Java (1) JWT退出 (1) RefreshToken (1) .NET Core网站开发框架 (1) Moz (3) 墨子 (1) JSON.NET (1) Newtonsoft (1) System.Text.Json (1) 自定义后台路径 (1) .netcore (1) quartz (2) 作业调度框架 (1) 作业调度 (1) 定时任务 (1) exception (1) 异常处理 (1) HttpClient (1) IHttpClientFactory (1) RDM (1) Redis (1) Redis Desktop Manager (1) RedisDesktopManager (1) linux (1) mac (1) windows (1) Could not get any response (1) postman (1) leetcode (2) 力扣 (1) 回文字符串 (1) 面试刷题 (1) centos7 (1) php安装 (1) 网易云插件 (1) 马甲App (1) Discuz插件 (1) 网易云音乐 (1) Blazor (1) 五子棋 (1) c#解题 (1) 最长连续序列 (1) Swagger (1) 在线文档 (1) blob (1) mp4 (1) 视频 (1) big file (1) 上传 (1) s (1) Azure (1) Azure Key Vault (1) Configuration (1) 密钥保管库 (1) Dapper安装 (1) Dapper是什么 (1) Dapper连接Mysql (1) Dapper连接SqlServer (1) dapper (1)