标签:数据类型 style gre 持久 com 对象 哈希 b2c 读写
redis是一个开源的,使用C语言编写的面向键值对类型的分布式Nosql数据库系统,功能类似Memcache,但比Memcache功能更丰富。
redis与Memcache的不同点:
支持持久化、主从复制;支持的类型多;
Memcache通过客户端驱动实现的集群,存储的时候通过算法来决定把值存在哪一台服务器中。
redis做集群与Memcach不同,每一个redis服务器都有一个完整的副本。
redis支持的数据类型有5种:
string : key为string,value支持各种格式,会自动序列化
list(链表) :双向链表可实现stack和queue
Hash(哈希) :高效存储对象
Set(集合)/ZSet(有序集合) :可以进行交集、并集、差集操作
第一步:下载redis,解压后如图所示:
第二步:配置
redis的相关配置是在配置文件redis.windows.conf(原生的redis在redis.conf中配置,配置方法一样)中进行的
基本配置:
绑定ip :bind 127.0.0.1
端口号:port 6379
加密: requirepass 123321
持久化方式的配置:
① 快照方式进行持久化,默认方式
配置文件中:save 900 10
持久化方式:九百秒大于10条记录就存储,储存在dump.rdb文件中(在这段时间内服务器出问题会来不及保存,造成数据丢失)
② aof方式(append-only file)
配置文件中:
appendonly yes(默认是no) --开启aof
appendfsync always(每次都写入,性能差但是持久化最有保障)
everysec(一秒写一次)
no (操作系统控制,性能好但是持久化没有保障)
持久化方式:redis将收到的写命令都通过write函数追到到文件中,当redis重启时会通过重新执行文件中的写命令在内存中重建(数据不会丢失,影响了性能)
第三步:安装与测试
安装方法:
下边给出了在.net中使用的方法
1 static void Main(string[] args) 2 { 3 //---------获取redisClient对象 4 IRedisClientsManager clientManager = new PooledRedisClientManager(new string[]
{ "127.0.0.1:6379", "10.122.0.1" }); 5 IRedisClient client = clientManager.GetClient(); 6 7 //简单测试数据 8 UserInfo user1 = new UserInfo() { UserName = "zs", Age = 18 }; 9 UserInfo user2 = new UserInfo() { UserName = "ls", Age = 20 }; 10 11 12 //---------------------------------string类型-------------------------------------------// 13 //string存一个对象 14 client.Set<UserInfo>("user1", user1); 15 UserInfo userGot = client.Get<UserInfo>("user1"); 16 Console.WriteLine(userGot.UserName); 17 18 //string存一个list 19 List<UserInfo> userlist = new List<UserInfo>() { user1, user2 }; 20 client.Set<List<UserInfo>>("userlist", userlist);//存入list 21 List<UserInfo> listGot = client.Get<List<UserInfo>>("userlist");//取出list 22 foreach (UserInfo user in listGot) 23 { 24 Console.WriteLine(user.UserName); 25 } 26 27 28 //---------------------------------hash类型---------------------------------------// 29 30 client.SetEntryInHash("usert", "UserName", "zs"); 31 client.SetEntryInHash("usert", "Age", "18"); 32 33 List<string> listKeys = client.GetHashKeys("usert");//获取key 结果:UserName,Age 34 List<string> listValues = client.GetHashValues("usert");//获取值 结果:zs,18 35 List<string> listAllK = client.GetAllKeys();//获取所有的key。 36 37 38 //-------------------------list类型(只支持<string,string>)------------------------// 39 40 //队列使用 41 client.EnqueueItemOnList("listQueue", "item1"); 42 client.EnqueueItemOnList("listQueue", "item2"); 43 int count = client.GetListCount("listQueue"); 44 for (int i = 0; i < count; i++) 45 { 46 Console.WriteLine(client.DequeueItemFromList("listQueue"));//结果:item1,item2 先进先出 47 } 48 49 //栈使用 50 client.PushItemToList("listStack", "item1"); 51 client.PushItemToList("listStack", "item2"); 52 int count = client.GetListCount("listStack"); 53 for (int i = 0; i < count; i++) 54 { 55 Console.WriteLine(client.PopItemFromList("listStack"));//结果:item2,item1 先进后出 56 } 57 58 //-------------------------Set类型只支持<string,string>--------------------------// 59 //对Set类型进行操作 60 client.AddItemToSet("set1", "111"); 61 client.AddItemToSet("set1", "222"); 62 client.AddItemToSet("set1", "333"); 63 client.AddItemToSet("set1", "444"); 64 client.AddItemToSet("set1","555"); 65 66 //client.RemoveItemFromSet("set1", "111");//删除111 67 //获取set中的数据 68 HashSet<string> hashset = client.GetAllItemsFromSet("set1"); 69 foreach (string str in hashset) 70 { 71 Console.WriteLine(str);//每次abcde的顺序都不一样 72 } 73 74 client.AddItemToSet("set2", "444"); 75 client.AddItemToSet("set2", "555"); 76 client.AddItemToSet("set2", "666"); 77 client.AddItemToSet("set2", "777"); 78 79 //求并集 结果:1~7 80 HashSet<string> hashset1 = client.GetUnionFromSets(new string[]{"set1", "set2"});81 82 //求交集 结果:444 555 83 HashSet<string> hashset2 = client.GetIntersectFromSets(new string[] { "set1", "set2" });84 85 //求差集(第一个set有,第二个set没有) 结果:111 222 333 86 HashSet<string> hashset3 = client.GetDifferencesFromSet("set1",new string[]{"set2"}); 87 88 }
redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。
加密方法1:初始化Redis密码:
配置文件中: requirepass 123321;(Ps:需重启Redis才能生效)
加密方法2:不重启Redis设置密码(shell中进行):
配置文件中: requirepass 123321;
shell执行 : redis 127.0.0.1:6379> config set requirepass 123321
登陆有密码的Redis:
redis-cli -p 6379
redis 127.0.0.1:6379> auth 123321
查询密码:
redis 127.0.0.1:6379> config get requirepass
(error) ERR operation not permitted
密码验证:
redis 127.0.0.1:6379> auth 123321
OK
再次查询:
redis 127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123321"
redis主从复制机制中一个master可以有多个slave,而一个slave也可以有多个slave,如此可是使用redis搭建多级的服务器集群。
一般写操作在master服务器中写,在通过主从复制写入slave服务器,查操作通过slave服务器中获取(因为写的操作一般比较少,而读的操作多)
怎么搭建集群:
1、三台电脑为例,一主二从,建立三个redis服务器MasterRedis,SlaveRedis1,SlavaRedis2
2、在Master的配置文件修改:
port 6379 ---- bind 192.168.2.153 ------ reqirepass 123321
3、在Slave1中
port 6379----- bind 192.168.2.154 ----- slaveof 192.168.2.153 6379 --- masterauth 123321
在Slave2中
port 6379 ----- bind 192.168.2.155 ----- slaveof 192.168.2.153 6379 --- masterauth 123321
4、推荐:Master关闭save和appendonly
Slave开启save和appendonly,bgrewriteaof
(Master只向内存写,不考虑持久化,让Slave来进行持久化和Aof日志记录,这样做的优势是Master的性能达到最好)
1 static void Main(string[] args) 2 { 3 //获取master服务器client,用于写操作 4 IRedisClientsManager masterClientManager = new PooledRedisClientManager(new string[]
{ "192.168.2.153:6379" }); 5 IRedisClient writeClient = masterClientManager.GetClient(); 6 writeClient.Password = "123321"; 7 8 //获取salve服务器client,用于读操作 9 IRedisClientsManager slaveClientManager = new PooledRedisClientManager(new string[]
{ "192.168.2.154:6379", "192.168.2.154:6379" }); 10 IRedisClient readClient = slaveClientManager.GetClient(); 11 readClient.Password = "123321"; 12 13 writeClient.Set<string>("testkey", "can you get me?"); 14 string getStr = readClient.Get<string>("testkey"); 15 Console.ReadKey(); 16 }
标签:数据类型 style gre 持久 com 对象 哈希 b2c 读写
原文地址:https://www.cnblogs.com/wyy1234/p/9052877.html