首先,以前我对Redis一直是有所耳闻,不过一直没有自己去真正使用过。这次 由于自己的业务功能涉及到需要使用NoSQL的,所以针对Redis写一个小Demo练习一下。
虽然是领导指定使用的Redis,不过不得不说Redis还是有其优势的。
一、Redis简介
Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且提供了多种语言的API
性能测试结果表示SET操作每秒钟可达110000次,GET操作每秒81000次(当然不同的服务器配置性能不同)。
Redis目前提供五种数据类型:string(字符串),list(链表), Hash(哈希),set(集合)及zset(sorted set) (有序集合)
Redis开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
二、Redis与Memcached的比较.
1.Memcached是多线程,而Redis使用单线程.
2.Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。
3.Redis可以实现持久化,主从复制,实现故障恢复。
4.Memcached只是简单的key与value,但是Redis支持数据类型比较多。
Redis的存储分为内存存储、磁盘存储 .从这一点,也说明了Redis与Memcached是有区别的。Redis 与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。
其实aof目的主要是数据可靠性及高可用性
三、Redis安装
在安装过程中发生了一件让人啼笑皆非的事。我是从官网上下载的,官网只提供linux版本 而我使用的是windows系统... 看上去跟我之前从别人那看到的不一样 没有exe文件...
看了网上教程才知道 现在只要GitHub提供下载 https://github.com/MSOpenTech/redis/tags 我下载的是64位版本的 可以选择一个磁盘目录 解压进去就行
文件说明:
redis-server.exe:服务程序
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询.
redis-cli.exe: 服务端开启后,我们的客户端就可以输入各种命令测试了
1、打开一个cmd窗口,使用cd命令切换到指定目录(F:\Redis)运行 redis-server.exe redis.conf
2、重新打开一个cmd窗口,使用cd命令切换到指定目录(F:\Redis)运行 redis-cli.exe -h 127.0.0.1 -p 6379,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口 (这样可以开启一个客户端程序进行特殊指令的测试)
接下来在使用Redis时,还需要下载C#驱动(也就是C#开发库),如下图:
当然,我们可以直接在项目管理NuGet程序包中下载ServiceStack.Redis
四、给Redis设置密码
在讲Redis数据类型之前,我们先给Redis设置上密码,不能让其在外网环境下面裸奔啊,我们可以为其设置一个复杂的访问密码,最好20位以上,这样可以有效防止别人暴力破解。
找到redis的配置文件,默认在安装指定目录下conf文件夹中,我的是在:E:\Redis\conf\redis.conf,查找requirepass选项配置
把这个选项前面的#注释干掉,然后在后面添加一个复杂的密码
# use a very strong password otherwise it will be very easy to break.
#
requirepass @Test_20190505_chuanlei
# Command renaming.
五、Redis常用数据类型
使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。
Redis最为常用的数据类型主要有以下五种:
- String
- Hash
- List
- Set
- Sorted set
static string host = "127.0.0.1";/*访问host地址*/ static string password = "@Test_20190505_chuanlei"; static readonly RedisClient client = new RedisClient(host, 6379, password);
public string TestRedis() { client.Set<int>("pwd", 1111); int pwd = client.Get<int>("pwd"); //client.BgSave(); UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };//</span>(底层使用json序列化 ) client.Set<UserInfo>("userInfo", userInfo); UserInfo user = client.Get<UserInfo>("userInfo"); List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "111" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } }; for (int i = 0; i < 50; i++) { UserInfo ui = new UserInfo(); ui.UserName = "uname" + i; ui.UserPwd = "upwd" + i; list.Add(ui); } client.Set<List<UserInfo>>("list", list); List<UserInfo> userInfoList = client.Get<List<UserInfo>>("list"); List<UserInfo> ulist = new List<UserInfo>(); foreach (var item in userInfoList) { UserInfo ui = new UserInfo(); ui.UserName = item.UserName; ui.UserPwd = item.UserPwd; ui.NowDateTime = DateTime.Now.ToString(); ui.UptUser = "admin"; ulist.Add(ui); } client.Set<List<UserInfo>>("ulist", ulist); List<UserInfo> uList = client.Get<List<UserInfo>>("ulist"); }
以上是普通的读写,也是我初步的运用
欢迎提问!