Redis(Remote Dictionary Server)官网:https://redis.io/
Redis命令:https://redis.io/commandsRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.//------------------------------------- Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。 它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的地理空间索引。 Redis具有内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性并使用Redis Cluster自动分区。
所以我们非常渴望有一个东西可以解决上面三个问题,自己研发太费时费力,刚好redis就是为了解决这些头疼的问题。
虚拟机CentOS7安装步骤:https://www.cnblogs.com/wyt007/p/10295834.html
XShell6破解版:链接: https://pan.baidu.com/s/1YtnkN4_yAOU5Dc1j69ltrg 提取码: nchp
如果出现 gcc:命令未找到 ,安装gcc并重新执行 make
yum -y install gcc automake autoconf libtool make//如果以上命令出现[Errno 256] No more mirrors to try.执行下面命令再重新安装gcc yum clean all
如果出现:致命错误:jemalloc/jemalloc.h:没有那个文件或目录,则执行下方命令
make MALLOC=libc
protect-mode 保护模式bind 绑定网卡接口bind 127.0.0.1 => bind 0.0.0.0 protected-mode yes => protected-mode no
现实场景:redis是生产内网部署,对外不开放端口。。。
[root@localhost redis]/# ./redis-server ./redis.conf [root@localhost redis]/# netstat-tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp0 0 0.0.0.0:6379 0.0.0.0:/* LISTEN 66042/./redis-serve tcp0 0 0.0.0.0:111 0.0.0.0:/* LISTEN 1/systemd tcp0 0 0.0.0.0:6000 0.0.0.0:/* LISTEN 7748/X tcp0 0 192.168.122.1:53 0.0.0.0:/* LISTEN 7604/dnsmasq tcp0 0 0.0.0.0:22 0.0.0.0:/* LISTEN 7215/sshd tcp0 0 127.0.0.1:631 0.0.0.0:/* LISTEN 7217/cupsd tcp0 0 127.0.0.1:25 0.0.0.0:/* LISTEN 7432/master tcp0 0 127.0.0.1:6010 0.0.0.0:/* LISTEN 9283/sshd: root@pts tcp0 0 127.0.0.1:6011 0.0.0.0:/* LISTEN 11424/sshd: root@pt tcp0 0 127.0.0.1:6012 0.0.0.0:/* LISTEN 63727/sshd: root@pt tcp60 0 :::111 :::/* LISTEN 1/systemd tcp60 0 :::6000 :::/* LISTEN 7748/X tcp60 0 :::21 :::/* LISTEN 9406/vsftpd tcp60 0 :::22 :::/* LISTEN 7215/sshd tcp60 0 ::1:631 :::/* LISTEN 7217/cupsd tcp60 0 ::1:25 :::/* LISTEN 7432/master tcp60 0 ::1:6010 :::/* LISTEN 9283/sshd: root@pts tcp60 0 ::1:6011 :::/* LISTEN 11424/sshd: root@pt tcp60 0 ::1:6012 :::/* LISTEN 63727/sshd: root@pt [root@localhost redis]/# tail/var/run/redis_6379.pid66042View Code
Docker安装步骤:https://www.cnblogs.com/wyt007/p/10295834.html
我们可以看到容器内是空的,我们接下来前往DockerHub下载安装redis(部分内容需要FQ)
这时候在再查看Docker容器
更复杂的配置,应该自己写一个redis.conf,通过docker-compose 部署进去。而不是自己敲命令。dockerfile需要拷贝redis.conf
github地址:https://github.com/StackExchange/StackExchange.Redis/
使用文档:https://stackexchange.github.io/StackExchange.Redis/String的应用web网站上保存用户信息,模拟session。netcore 中使用redis作为分布式session共享。 {框架集成} Hash的应用 记录每个店铺的数据库连接串。(分库的场景) key: shopid value:connectionstring Set的应用 判断某一个用户是否在黑名单中。 O(1) List的应用 消息队列 client -> 短信队列 <- 发送处理程序 -> 运营商
classProgram {static void Main(string[] args) { ConnectionMultiplexer redis= ConnectionMultiplexer.Connect("192.168.181.131:6379"); IDatabase db= redis.GetDatabase(0);//////cookie(ui,sessionid)//////redis(sessionid,userinfo) //db.StringSet("sessionid", "jack", TimeSpan.FromSeconds(5));//while (true)//{//var info = db.StringGet("sessionid");//Console.WriteLine(info);//Thread.Sleep(1000);//} ////key: shopID value: connectionstring //db.HashSet("connetions", "1", "mysql://192.168.1.1/mydb");//db.HashSet("connetions", "2", "mysql://192.168.1.2/mydb");//db.HashSet("connetions", "3", "mysql://192.168.1.3/mydb");//db.HashSet("connetions", "4", "mysql://192.168.1.4/mydb");//db.HashSet("connetions", "5", "mysql://192.168.1.5/mydb");//Console.WriteLine(db.HashGet("connetions", "3")); ////黑名单 //db.SetAdd("blacklist", "1");//db.SetAdd("blacklist", "2");//db.SetAdd("blacklist", "3");//db.SetAdd("blacklist", "4");//var r = db.SetContains("blacklist", 40); ////消息队列 //db.ListLeftPush("sms", "18721073333");//db.ListLeftPush("sms", "18521073333");//db.ListLeftPush("sms", "18121073033");//Console.WriteLine(db.ListRightPop("sms"));//Console.WriteLine(db.ListRightPop("sms"));//Console.WriteLine(db.ListRightPop("sms")); Console.ReadKey(); } }View Code
为什么要使用强类型扩展?我们可以先看一段代码:
classProgram {static void Main(string[] args) { ConnectionMultiplexer redis= ConnectionMultiplexer.Connect("192.168.181.131:6379"); IDatabase db= redis.GetDatabase(0);var userModel = newUserModel() { UserName= "jack", Email= "sdfasdf@qq.com", IsVip= true}; db.StringSet("userinfo", JsonConvert.SerializeObject(userModel));var info = db.StringGet("userinfo");var model = JsonConvert.DeserializeObject
要存储数据先要进行序列化成String,然后进行存储,取出时又要进行反序列化,那么有没有更好的方式来处理这个问题呢? StackExchange.Redis.Extensions 为我们提供了很好的扩展
StackExchange.Redis.Extensions githun地址:https://github.com/imperugo/StackExchange.Redis.Extensions
classProgram {static void Main(string[] args) { ConnectionMultiplexer redis= ConnectionMultiplexer.Connect("192.168.181.131:6379"); IDatabase db= redis.GetDatabase(0);var userModel = newUserModel() { UserName= "jack", Email= "sdfasdf@qq.com", IsVip= true}; db.StringSet("userinfo", JsonConvert.SerializeObject(userModel));var info = db.StringGet("userinfo");var model = JsonConvert.DeserializeObject
public classRedisConnectionPool {private static ConcurrentQueue
RedisConnectionPool.InitializeConnectionPool();for (int m = 0; m < 100; m++) { ConnectionMultiplexer client= null;try{ client=RedisConnectionPool.GetConnection();var db = client.GetDatabase(0); db.StringSet("username", "jack"); Console.WriteLine(db.StringGet("username") + " " +m); }finally{if (client != null) { RedisConnectionPool.PushConnection(client); } }//ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.181.131:6379");//Console.WriteLine(m); }View Code
源码由Redis官方下载下来并解压,然后用VS2017打开,源码在src文件夹下,redis存储结构:
我们可以看到 server.dbnum 默认值为16
typedef char /sds;//Note: sdshdr5 is never used, we just access the flags byte directly. / However is here to document the layout of type 5 SDS strings.// structattribute ((packed)) sdshdr5 { unsignedchar flags; //3 lsb of type, and 5 msb of string length// charbuf[]; };struct__attribute__ ((__packed__)) sdshdr8 { uint8_t len;//*used/*/uint8_t alloc;//*excluding the header and null terminator/*/unsignedchar flags; //*3 lsb of type, 5 unused bits/*/ charbuf[]; };struct__attribute__ ((__packed__)) sdshdr16 { uint16_t len;//*used/*/uint16_t alloc;//*excluding the header and null terminator/*/unsignedchar flags; //*3 lsb of type, 5 unused bits/*/ charbuf[]; };struct__attribute__ ((__packed__)) sdshdr32 { uint32_t len;//*used/*/uint32_t alloc;//*excluding the header and null terminator/*/unsignedchar flags; //*3 lsb of type, 5 unused bits/*/ charbuf[]; };struct__attribute__ ((__packed__)) sdshdr64 { uint64_t len;//*used/*/uint64_t alloc;//*excluding the header and null terminator/*/unsignedchar flags; //*3 lsb of type, 5 unused bits/*/ charbuf[]; };View Code
Redis中String命令:https://redis.io/commands/#stringRedis命令 incr decr incrby decrby C/#命令 ++ -- Interlocked.Incrment Interlocked.Decrement 命令示例 redis> SET mykey "10" "OK" redis> INCR mykey (integer) 11 redis> GET mykey "11" redis> SET mykey "10" "OK" redis> DECR mykey (integer) 9 redis> SET mykey "234293482390480948029348230948" "OK" redis> DECR mykey ERR ERR value is not an integer or out of range redis> SET mykey "10" "OK" redis> INCRBY mykey 5 (integer) 15 redis> SET mykey "10" "OK" redis> DECRBY mykey 3 (integer) 7
库存:1000 人数:10w
购买:3000 只放3000进来。
购买:1000
待付款减库存,还是购买成功减库存,这是业务的事情!
用max来进行人员的过滤。。。简单示例:
classProgram {static void Main(string[] args) { ConnectionMultiplexer redis= ConnectionMultiplexer.Connect("192.168.181.131:6379"); IDatabase db= redis.GetDatabase(0);while (true) {var num = db.StringIncrement("max1");if (num>3000) { Console.WriteLine("当前请求>3000");break; } Console.WriteLine(num); } Console.ReadKey(); } }View Code
setnx token 12345 (处理成功)setnx token 12345 (处理失败)
EXPIRE设置过期时间
转化成Set
说明10秒之内重复SET是不被允许的c/#代码示例:
classProgram {static void Main(string[] args) { ConnectionMultiplexer redis= ConnectionMultiplexer.Connect("192.168.181.131:6379"); IDatabase db= redis.GetDatabase(0);while (true) {var b = db.StringSet("token", "123456", TimeSpan.FromSeconds(10), When.NotExists); Console.WriteLine(b); Thread.Sleep(TimeSpan.FromSeconds(2)); } Console.ReadKey(); } }View Code
![](https://img2018.cnblogs.com/blog/991704/201901/991704-20190122191440