Redis (Remote Dictionary Server 远程字典服务)是一个使用 ANSI C 编写的开源、包含多种数据结构,支持网络、基于内存、可选持久性的键值对存储数据库,是现在最受欢迎的NoSQL数据库之一。
ANSI C 是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。ANSI C 主要标准化了现存的实现,同时增加了一些来自 C++ 的内容(主要是函数原型),并支持多国字符集(包括备受争议的三字符序列)。ANSI C 标准同时规定了 C 运行期库例程的标准。
主要应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
本文是介绍 Windows 平台,可以选择直接下载 Redis-x64-3.0.504.zip。
下载的安装包解压后,在文件中找到配置文件:redis.windows.conf,进行编辑。
(若不修改配置文件直接启动服务,则数据库可在任意服务器通过当前服务器的 IP 和 端口 6379 进行访问,安全性较差)
下边列出常用的几个配置:
# 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求
bind 127.0.0.1
# redis监听的端口号
port 6379
# 数据库的数量,默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始
databases 16
# requirepass 配置可以让用户使用 AUTH 命令来认证密码
# 使用 requirepass 的时候需要注意,因为 redis 太快了,每秒可以认证 15w 次密码
# 简单的密码很容易被攻破,所以最好使用一个更复杂的密码
requirepass passwordmyself_
详细配置可参考:redis配置文件中常用配置详解
1/4 若不需要配置密码,就可以直接双击 redis-server.exe,启动 Redis 服务,然后用 RedisDesktopManager 客户端测试连接。如下图:
(亦可通过 cmd 命令行启动,通过 cd 进入 Redis 文件夹,输入命令:redis-server.exe 回车即可)
2/4 若修改了 redis.windows.conf 配置文件,就需要启动服务时加上配置文件名,不然配置项不起效。
cmd 命令行输入 redis-server.exe redis.windows.conf 回车。
3/4 将 Redis 添加为系统服务,建议手动修改为自动启动。
cmd 命令行输入 redis-server --service-install redis.windows.conf 回车。
启动服务:redis-server --service-start
停止服务:redis-server --service-stop
删除服务:sc delete servicename
4/4 验证服务
切换到 redis 目录下:redis-cli.exe -h 127.0.0.1 -p 6379
若能如图成功进入 Redis 数据库,就证明数据库可用。
本文通过引用 ServiceStack.Redis.dll 来完成程序与数据库的交互。假设要应用到业务环境中,我们选择版本 v3.9.71。
相关的动态库共包括三个:ServiceStack.Redis.dll、ServiceStack.Common.dll、ServiceStack.Text.dll。版本都选择 v3.9.71。
首先我们可以采用方法 IncrementValue(string key) 生成序号,当 key 值不存在时,Redis 会自动创建,并返回 1,后续每调用一次就 +1。
long xuhao = redisClient0.IncrementValue("xuhaolie");
但是取到序号后,我们会做一系列操作,如果执行操作过程中出现异常,那么生成的序号也就被占用了。
当并发量不大,同时也不想被占用,可以通过新增一个 key-value 的方式,每次操作前取出 value ,操作成功后再将序号 +1 存入。如下例子:
string redishost = configurationRoot["OrderingPara:redishost"];
string redisport = configurationRoot["OrderingPara:redisport"];
string redispass = configurationRoot["OrderingPara:redispass"];
string shunxuhao = string.Empty, hashId = string.Empty;
// 数字代表,实例 redisClient 对应的数据库,默认有 16 个,序号从 0~15
using (RedisClient redisClient = new RedisClient(redishost, redisport, redispass, 0))
{
// GetValuesFromHash:根据 hashId 和 key 取 value
var xuhaolist = redisClient.GetValuesFromHash(hashId, "shunxuhao");
// public List<string> GetValuesFromHash(string hashId, params string[] keys);
if (xuhaolist.Count == 1 && xuhaolist[0]==null)// 未查到 key 为“shunxuhao”的键值对
{
using (RedisClient redisClient1 = new RedisClient(redishost, Convert.ToInt32(redisport), redispass, 1))
{
redisClient1.FlushDb();// 根据业务需要,仅清空 db(1),其他数据库不影响
}
redisClient.SetEntryInHash(hashId, "shunxuhao", "1");// 新增 key 为“shunxuhao”,值为“1”的键值对
xuhaolist = redisClient.GetValuesFromHash(hashId, "shunxuhao");// 新增数据后再查询确认
}
if (xuhaolist.Count == 1 && xuhaolist[0] != null)
{
shunxuh = xuhaolist[0];
}
else
return new Info { code = 1, message = "失败" };
}
// 其他业务操作。。。省略
//顺序号 +1 后,再存入
shunxuh = (Convert.ToInt32(shunxuh)+1).ToString();
using (RedisClient redisClient = new RedisClient(redishost, redisport, redispass, 0))
{
redisClient.SetEntryInHash(hashId, "shunxuhao", shunxuh);
}
string 数据操作举例:
// 新增 key 为“shunxuhao”,值为“1”的键值对
redisClient.SetEntryInHash(hashId, "shunxuhao", "1");
// 获取一个 hash 队列的全部值
var oparajsonlist = redisClient.GetHashValues(hashId);
// 根据 hashId 和 key 取 value
var xuhaolist = redisClient.GetValuesFromHash(hashId, "shunxuhao");
// 删除指定的键值
redisClient.RemoveEntryFromHash(hashId, orderinfo.ID);
// 仅清空 db(0)(某一个数据库),其他数据库不影响
redisClient0.FlushDb();
// 清空全部 db, 慎用!
//redisClient0.FlushAll();
更多数据类型的使用,详见命名空间:ServiceStack.Redis。(引用后可在 VS 中查看)
报错条件:当项目中引用的 ServiceStack.Redis.dll 版本在 v4 及以上,且业务操作比较复杂,就有可能出现如下报错内容:
The free-quota limit on ‘6000 Redis requests per hour‘ has been reached. Please see https://servicestack.net to upgrade to a commercial license.
原因:因为 ServiceStack.Redis.dll 这个官方 Redis 访问组件从 4.0 版本后开始商业化了,添加了调用频率的限制。
解决:如本文第二部分介绍的,将版本降至 v3.9.71,并另外添加两个动态库的引用(ServiceStack.Common.dll、ServiceStack.Text.dll)即可。
当然不同版本的写法也有区别,如下:
// 新版写法 v4 及以后
var redisEndpoint = new RedisEndpoint { Host = "", Password = "", Port = Convert.ToInt32("3679"), Db = 0 };
using (RedisClient redisClient = new RedisClient(redisEndpoint))
{
var strlist = redisClient.GetHashValues("hashId");//新老版本语法相同
}
// 旧版写法 v4 之前
using (RedisClient redisClient = new RedisClient("redishost", Convert.ToInt32("redisport"), "redispass", 0))
{
var strlist = redisClient.GetHashValues("hashId");//新老版本语法相同
}
注:后续遇到其他问题再来,有问题欢迎大家指正或补充。
本文简单介绍了 Redis 的下载、安装,以及基于 ServiceStack.Redis.dll 的使用,希望对你有帮助。