(一)redis(在.net core中)
redis的作用及优势:
1:单机抗高并发能力很强,一般几十万的并发量都可以扛得住,所以在处理热数据(经常访问的数据)很有优势
2:当用户登陆后,可以存储当前用户关联的所有信息,避免了从数据库大量数据里面再次做赛选查询
3:aof(备份命令),rdb(备份数据)可以解决服务器断掉造成的数据丢失,开机后数据可以自动恢复,aof还支持命令重写,避免了一些无效命令对磁盘空间的浪费
4:减少了对数据库的访问,降低了数据库的访问压力
注意:
1:对于一些不经常使用的数据(冷数据),而且数据量比较大的,不建议使用redis,因为对于单个用户的查询,同等的数量的数据,redis的查询数据可能还没有直接从数据库查询快,而且还消耗了内存,呢种就比较不划算
实现代码:
1:在nuget里面下载CSRedisCore
2:服务端密码设置
配置文件redis.windows-service.conf修改密码
找到pass,修改成自己需要设置的密码
3:服务端启用配置文件
E:\网站项目ssssssssss\学习资料(白天)\ef\redis\Redis-x64-3.2.100,然后cmd,
启用服务端redis: redis-server.exe redis.windows-service.conf,然后点击redis-cli.exe,
然后在要访问redis就需要:auth 123456验证密码了,相当于只要服务端是以edis-server.exe redis.windows-service.conf呢种方式启动的,客户端链接都需要密码验证
4:下面呢种设置在项目中意义不大,一般不呢样设置
点击redis-cli.exe,设置密码:config set requirepass 123456,验证密码:auth 123456,获取密码:config get requirepass
5:设置密码要按3步骤来设置,不能按4步骤来设置
6:然后在redis基础类构造方法里面初始化RedisHelper,之后就可以调用RedisHelper里面的方法了
public RedisService()
{
var csredis = new CSRedisClient("127.0.0.1:6379,Password=123456,SyncTimeout=15000");
RedisHelper.Initialization(csredis);
}
7:redis里面常见得5种存储类型:string,hash,list,set,zset
(1):string一个键对应一个值;
RedisHelper.Del("userkey");
RedisHelper.Set("userkey", "wsh");//存值
string ss = RedisHelper.Get("userkey");//取值
(2):hash一个key对应多个属性,每个属性对应各种的值;(例如存取一个对象,一个对象对应了多个属性,每个属性对应一个值)
RedisHelper.HDel("hash", "no");//删除单个属性值
RedisHelper.Del("hash");//删除hash对象
RedisHelper.HSet("hash", "no", "111");//存值
RedisHelper.HSet("hash", "name", "222");//存值
string name = RedisHelper.HGet("hash", "name");//取单个属性值
#region 获取对象得所有属性值,并且转换成一个完整得对象
Mem mem = new Mem();
Dictionary<string, string> dic1 = RedisHelper.HGetAll<string>("hash");
for(int i = 0; i < dic1.Count; i++)
{
mem.no = dic1["no"];
mem.name = dic1["name"];
}
#endregion
(3):list链表形式存储,取值按坐标序号取某一段来取;(.net里面可以从左插入,从右插入,但是取只能只能从左开始取LRange)
RedisHelper.Del("list");
#region 一个一个对象得存
RedisHelper.RPush("list", "4");
RedisHelper.RPush("list", "1");
RedisHelper.RPush("list", "2");
RedisHelper.RPush("list", "3");
#endregion
string[] result = RedisHelper.LRange("list", 1, 2);//取值结果1,2
RedisHelper.LTrim("list", 1, 3);//只保留1,2,3,其他的移除掉
string[] result1 = RedisHelper.LRange("list", 0, -1);//取集合的所有(取值结果1,2,3,因为上面只保留了1,2,3)
string objval = RedisHelper.LPop("list");//移除并获取列表得第一个元素
#region 直接作为一个数组推进去
TestCls[] array = new TestCls[10];
for (int i = 0; i < 10; i++)
{
TestCls cls = new TestCls();
cls.name = "111" + i;
cls.no = "222" + i;
cls.str = "333" + i;
array[i] = cls;
}
RedisHelper.LPush("list", array);
#endregion
TestCls[] c = RedisHelper.LRange<TestCls>("list", 0, -1);//获取方式跟上面得方式一样获取
List<TestCls> cc = RedisHelper.LRange<TestCls>("list", 0, -1).Where(m => m.no == "2223").ToList();//没有延迟加载,所有的查出来在筛选
(4):set无序集合,取随机数,可定义要取的个数,取交集,并集合,差集(第一个set里面有1,2,3,第二个set里面有3,4,5,取值结果1,2)
RedisHelper.Del("set");
RedisHelper.Del("set1");
RedisHelper.SAdd("set", "111", "222", "333");//存值
RedisHelper.SAdd("set1", "333", "444", "555");//存值
string[] yyy = RedisHelper.SUnion("set", "set1");//并集(第一个集合和第二个集合合并起来,去重)
string[] yyy1 = RedisHelper.SDiff("set", "set1");//差集合(第一个集合里面有,第二个集合里面没有得,以第一个集合为基准)
string[] yyy2 = RedisHelper.SInter("set", "set1");//交集合(第一个集合和第二个集合里面都有的)
string[] yyy = RedisHelper.SMembers("set");//获取集合中的所有元素
string[] yyy1 = RedisHelper.SRandMembers("set", 2);//随机返回集合中的两个元素
string fs= RedisHelper.SPop("set");//随机移除获取集合中的一个元素
(5)zset有序集合(按分数取值,或者按分数排序后取想要的个数)
RedisHelper.ZAdd("Quiz", (79, "Math"));//存值
RedisHelper.ZAdd("Quiz", (98, "English"));//存值
RedisHelper.ZAdd("Quiz", (87, "Algorithm"));//存值
RedisHelper.ZAdd("Quiz", (84, "Database"));//存值
RedisHelper.ZAdd("Quiz", (59, "Operation System"));//存值
string[] we = RedisHelper.ZRange("Quiz", 0, 2);//按分数排正序以后取0-2三个元素,ZRevRange倒叙
string[] objs = RedisHelper.ZRangeByScore("Quiz", 59, 60);//取59<=分数<=60的元素
(string, decimal)[] objs1 = RedisHelper.ZRangeWithScores("Quiz", 0, -1);//按分数排正序取所有元素(分数,包括值),ZRevRangeWithScores倒叙
string valus= objs1[0].Item1;
decimal score = objs1[0].Item2;
long result= RedisHelper.ZRem("Quiz", "Math");//移除集合中的元素
long coung = RedisHelper.ZCard("Quiz");//返回集合中的元素数量
bool result = RedisHelper.Exists("k");//判断元素是否存在
8:分布式锁
//设置分布式锁,防止多线程在下面得逻辑没有走完其他线程进进入下面逻辑,导致获取到得数据是脏数据,不是最新真实数据,不如抢单,计算商品数量,下面得还没有减去商品数量就开始获取数量了,呢时候获取到得数量不是最新数量,所以要加分布式锁
if(RedisHelper.SetNx("lock", 1))
{
RedisHelper.Expire("lock", 30);//30秒后自动过期,防止死锁
//.......需要走得业务逻辑
RedisHelper.Del("lock");//业务走完,删除分布式锁
}
9:修改端口
1在Redis安装目录中找到文件redis.windows.conf并打开
2找到文件中的port 6379 对端口号进行修改并保存
3再次启动Redis,注意:这次启动要在redis-server.exe后加上redis.windows.conf启动。即输入:redis-server.exe redis.windows.conf。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现