Redis

因为Redis是一个缓存服务,是可以通过设置一个超时时间让输入过期。你也可以通过移除那个超时来逆向这个过程。

键命令

用于管理Redis中的键

编号 命令 描述
1 DEL key 此命令删除一个指定键(如果存在)。
2 DUMP key 此命令返回存储在指定键的值的序列化版本。
3 EXISTS key 此命令检查键是否存在。
4 EXPIRE key seconds 设置键在指定时间秒数之后到期/过期。
5 EXPIREAT key timestamp 设置在指定时间戳之后键到期/过期。这里的时间是Unix时间戳格式。
6 PEXPIRE key milliseconds 设置键的到期时间(以毫秒为单位)。
7 TYPE key 返回存储在键中的值的数据类型。
8 KEYS pattern 查找与指定模式匹配的所有键。
9 MOVE key db 将键移动到另一个数据库。
10 PERSIST key 删除指定键的过期时间,得永生。
11 PTTL key 获取键的剩余到期时间。
12 RANDOMKEY 从Redis返回一个随机的键。
13 RENAME key newkey 更改键的名称。
14 SORT key [BY pattern] [LIMIT offset count] [ASC DESC] [ALPHA]

其中,KEYS pattern的用法:
h?llo matches hello, hallo and hxllo
h*llo matches hllo and heeeello
h[ae]llo matches hello and hallo, but not hillo
h[^e]llo matches hallo, hbllo, … but not hello
h[a-b]llo matches hallo and hbllo
Use  to escape special characters if you want to match them verbatim.

//domain object public class Schedule { public int Id {get; set;} public string Origin {get; set;} public string Destination {get; set;} } using(IRedisClient client = RedisClient) { var scheduleClient= client.GetTypedClientSchedule(); var schedule= new Schedule { Id= scheduleClient.GetNextSequence(), Origin ="Montreal", Destination = "Quebec" } var schedules = scheduleClient.Store(schedule); }

其他操作

Set<String> keys = jedis.keys("user.userid.*");  //对key的模糊查询
Boolean isExists = jedis.exists("user.userid.14101");  // 是否存在
jedis.setex("user.userid.14101", 5, "James");  // expire:时间为5s
Long seconds = jedis.ttl("user.userid.14101"); //存活时间(ttl):time to live
jedis.persist("user.userid.14101");  //去掉key的expire设置:不再有失效时间

自增的整型:

jedis.set("amount", 100 + "");  // int类型采用string类型的方式存储
jedis.incr("amount");  //递增或递减:incr()/decr()
jedis.incrBy("amount", 20);  // 增加或减少:incrBy()/decrBy()

数据清空:

jedis.flushDB();  //清空当前db
jedis.flushAll();// 清空所有db

redis下的db:
redis默认有db0~db15,总共16个数据库,数据库之间通过整数索引标识,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0。redis配置文件中下面的参数来控制数据库总数:

databases 16

可以通过下面的命令来切换到不同的数据库下

redis>select 2

随后,所有的命令将使用数据库2,直到你明确的切换到另一个数据库下。每个数据库都有属于自己的空间,不必担心之间的key冲突。

简单的说,Redis可以给你难以置信的存取你的对象状态的能力从而使你的应用更加快速。有时候,你的应用速度可以优化8到10倍。这并不是开玩笑的而且你不需要背后有Google或Facebook那样的基础设施。如果你想知道更多的关于Redis背后的思想和它的历史的内容,可以上网查找更多。有很多文章是关于这些的。

大量插入数据

打开redis.io,下载win64版本的redis(它并不会根据你的系统指定相应的版本)
将下载的内容复制到Redis文件夹(你也可以命名为其他你喜欢的名字) 点击
redis-server.exe 启动服务端 点击 redis-client.exe 运行客户端命令行工具
现在我们试着运行一些基本的命令来检测安装是否正确。在客户端命令行界面:
输入 set azul “hello world”
来添加一条记录,你会收到ok的反馈。这意味着你已经添加了一个键为azul值为”hello
world”的条目(顺便说下,azul在卡拜尔语中是问候的意思) 输入 get
azul取得相应的值,你会收到反馈 hello world 输入 delete
azul会删除这个条目

Redis

首先,按照下面的步骤安装并运行Redis:

1.1 Redis的优点

  • 异常快
    Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
  • 支持丰富的数据类型
    Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。
  • 操作具有原子性
    所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。
  • 多实用工具
    Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

这仅是一个关于Redis的简介,给你提供一个提高web引用性能的方法启示。在某些情况下,Redis可能会给你一些你的客户或者老板没有给你的,关于构建可靠软件的激情的认可。

Redis连接命令

编号 命令 描述
1 redis-cli 连接到本地Redis服务器
2 redis-cli -h host -p port -a password 该命令用于连接到Redis远程服务器,比如在主机(host)127.0.0.1,端口(port)6379上运行redis服务器,没有密码:redis-cli -h 127.0.0.1 -p 6379
3 ping 该命令检查服务器是否正在运行
4 AUTH password 使用给定的密码验证服务器
5 quit或exit 关闭当前连接
6 SELECT index 更改当前连接的所选数据库

简介

Redis发送订阅

发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。

大多数开发者习惯用关系型数据库。数据驱动开发或者领域驱动开发,关系型数据库的概念一样。另一方面,NoSql引领了新的数据存储时尚。在.NET社区最流行的是MongoDb,RavenDb和Redis。我已经写了一篇怎么使用MongDb的文章,你可以在这里找到。我使用它记录重要活动、错误和异常等的日志。

1.3 典型的NoSQL数据库

  • 关系型数据库:是指采用了关系模型来组织数据的数据库。标准数据查询语言SQL就是一种基于关系数据库的语言。关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了数据库。用户用查询(Query)来检索数据库中的数据。一个Query是一个用于指定数据库中行和列的SELECT语句。
  • NoSQL:“Not Only
    SQL”的缩写,它的意义是:适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。
    参考:NoSQL数据库的基础知识

到目前为止我们所做的一切都打破了常规。但在幕后却是Redis客户端通过Redis协议向服务器发送指令。服务器对内存中的数据执行这些指令,并返回响应结果。做为服务的Redis

Redis 哈希(Hashes)命令(完美用于表示对象)

编号 命令 描述
1 HDEL key field2 [field2] 删除一个或多个哈希字段。
2 HEXISTS key field 判断是否存在散列字段。
3 HGET key field 获取存储在指定键的哈希字段的值。
4 HGETALL key 获取存储在指定键的哈希中的所有字段和值
5 HINCRBY key field increment 将哈希字段的整数值按给定数字增加
6 HINCRBYFLOAT key field increment 将哈希字段的浮点值按给定数值增加
7 HKEYS key 获取哈希中的所有字段
8 HLEN key 获取散列中的字段数量
9 HMGET key field1 [field2] 获取所有给定哈希字段的值
10 HMSET key field1 value1 [field2 value2 ] 为多个哈希字段分别设置它们的值
11 HSET key field value 设置散列字段的字符串值
12 HSETNX key field value 仅当字段不存在时,才设置散列字段的值
13 HVALS key 获取哈希中的所有值

幕后

列表Lists

Redis列表只是字符串列表,按插入顺序排序。您可以向Redis列表的头部或尾部添加元素。
列表的最大长度为2^32 –
1个元素(4294967295,每个列表可容纳超过40亿个元素)。

因为Redis是一个字典,可以以如下方式保存键值:复制代码 代码如下:Set schedule:1
“{‘origin’:’Montreal’,’destination’:’Toronto’}”

使用Lists:

jedis.lpush("userList", "James");  
jedis.rpop("userList");   //可以使用列表模拟队列(queue)、堆栈(stack),并且支持双向的操作(L或者R)。
List<String> userList = jedis.lrange("userList", 0, -1);  //第0个到最后一个
jedis.del("userList");  
jedis.lset("userList", 1, "Nick Xu");  //设置位置1处为新值
Long size = jedis.llen("userList");  //返回长度
jedis.ltrim("userList", 1, 2);  //进行裁剪,只要第1和2个数据

你可以在物理机,虚拟机上使用Redis,也可以将Redis做为云服务。很多像Digital
Ocean和Widnows Azure这类的供应商都提供该服务。我们将从Digital
Ocean开始在添加monitor command的这种情况下发生了什么。

集合Sets

Redis集合是字符串的无序集合,重复的元素只会被添加一次。
一个集合中的最大成员数量为2^32 –
1(即4294967295,每个集合中元素数量可达40亿个)个。

然而,下面是一个添加对象的例子,在这个情况下式一个调度器:

1. 介绍

Redis是一个开源,高级的键值存储解决方案,用于构建高性能,可扩展的Web应用程序。

Redis有三个主要特点,使它优越于其它键值数据存储系统

  • Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。
  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。
  • Redis可以将数据复制到任意数量的从机中。

对于执行多个set 和get,可以使用mset
和mget来代替。我将不再对这些命令进行讨论。你可以查看Redis文档并尽情尝试。

分区(Partitioning):如何将你的数据分布在多个Redis里面

分区是将数据拆分为多个Redis实例的过程,因此每个实例只包含一部分键。

分区的优点:
它允许更大的数据库,使用更多计算机的内存总和。如果没有分区,则限制为单个计算机可以支持的内存量。
它允许将计算能力扩展到多个核心和多个计算机,并将网络带宽扩展到多个计算机和网络适配器。

缺点:操作更加复杂

分区类型

Redis中有两种类型的分区。假设有四个Redis实例:R0,R1,R2,R3以许多代表用户的键,如user:1,user:2,…等等。

  • 范围分区
    范围分区通过将对象的范围映射到特定的Redis实例来实现。假设在上面示例中,从ID
    0到ID 10000的用户将进入实例R0,而从ID 10001到ID
    20000的用户将进入实例R1,以此类推。

  • 哈希分区
    在这种类型的分区中,使用散列函数(例如,模函数)将键转换成数字,然后将数据存储在不同的Redis实例中。

在这个示例中的值是一个json对象。这意味着你可以向Redis中添加复杂的对象。但没必要这么做,因为Redis支持5种数据类型以满足你的需求。

字符串Strings

Redis中的字符串是一个字节序列。Redis中的字符串是二进制安全的,这意味着它们的长度不由任何特殊的终止字符决定。因此,可以在一个字符串中存储高达512兆字节的任何内容。

127.0.0.1:6379> set name "xiezhenwie"
OK
127.0.0.1:6379> get name
"xiezhenwie"

我曾开发一个有着复杂处理和过滤的web应用,因为很多业务规则和UI要求。再加上一些过时技术的第三方提供者,对于他们而言,速度意味着15年的工作丢进垃圾桶,然后重新开始。我的应用不是那么快,有时处理一个请求花费6~8s才会处理完,业务规则的验证、过滤和格式化响应。而客户不接受这样。并说如果Google做就会做好。同样,Facebook也行。我无法向客户解释速度后面的硬件是多么的庞大,服务器的压力怎样。我仅仅回复说可以做更好,我在记住Redis后保证可以做到。

澳门金沙vip,Redis HyperLogLog命令

Redis
HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。比如
{‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 基数为3
优点:即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的12
KB 内存。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
缺点:只会根据输入元素来计算基数,并且会有少许的误差。

编号 命令 描述
1 PFADD key element [element …] 将指定的元素添加到指定的HyperLogLog 中。
2 PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。
3 PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog

在完整的反HelloWorld应用风格的勇士兴奋的跳向天空之前,我还应该提醒一件事:从你的控制器连到你的数据库不是个好主意,如果这对你来说很奇怪,我认为你需要读一些关于设计和架构方面的东西。我不理解Microsoft的指导书让用户添加一个MVC项目,你就可以开始构建一耳光伟大的商业web应用了。因为不是这样。

Redis列表(Lists)命令

编号 命令 描述
1 BLPOP key1 [key2 ] timeout 删除并获取列表中的第一个元素,或阻塞,直到有一个元素可用,即若有元素,则立即返回,若无元素,则阻塞等待,一旦有新的数据出现在列表中,则立即返回,最大阻塞时间timeout秒
2 BRPOP key1 [key2 ] timeout 删除并获取列表中的最后一个元素,或阻塞,直到有一个元素可用
3 BRPOPLPUSH source destination timeout
4 LINDEX key index 通过其索引从列表获取元素
5 LINSERT key BEFORE/AFTER pivot value 在列表中的另一个元素之前或之后插入元素
6 LLEN key 获取列表的长度
7 LPOP key 删除并获取列表中的第一个元素
8 LPUSH key value1 [value2] 将一个或多个值添加到列表
9 LPUSHX key value 仅当列表存在时,才向列表添加值
10 LRANGE key start stop 从列表中获取一系列元素,从0开始,-1表示最后一个元素,-2表示倒数第二个
11 LREM key count value 从列表中删除元素
12 LSET key index value 通过索引在列表中设置元素的值
13 LTRIM key start stop 只保留列表的指定范围元素
14 RPOP key 删除并获取列表中的最后一个元素
15 RPOPLPUSH source destination 删除列表中的最后一个元素,将其附加到另一个列表并返回
16 RPUSH key value1 [value2] 将一个或多个值附加到列表
17 RPUSHX key value 仅当列表存在时才将值附加到列表

Redis代表了远程字典服务( Remote Dictionary Service)
。它是一个键值存储就像C#的字典对象。所以让我们看看如何使用:

Redis服务器

编号 命令 描述
1 BGREWRITEAOF 异步重写仅追加的文件
2 BGSAVE 将数据集异步保存到磁盘
3 CLIENT KILL [ip:port] [ID client-id] 杀死或断开指定的客户端的连接
4 CLIENT LIST 获取到服务器的客户端连接列表
5 CLIENT GETNAME 获取当前连接的名称
6 CLIENT PAUSE timeout 在指定时间内停止处理来自客户端的命令
7 CLIENT SETNAME connection-name 设置当前连接名称
8 CLUSTER SLOTS 获取群集插槽到节点映射的数组
9 COMMAND 获取Redis命令详细信息的数组
10 COMMAND COUNT 获取Redis命令的总数
11 COMMAND GETKEYS 提取键给出一个完整的Redis的命令
12 BGSAVE 将数据集异步保存到磁盘
13 COMMAND INFO command-name [command-name …] 获取特定Redis命令详细信息的数组
14 CONFIG GET parameter 获取配置参数的值
15 CONFIG REWRITE 使用内存中配置来重写配置文件
16 CONFIG SET parameter value 将配置参数设置为给定值
17 CONFIG RESETSTAT 重置由INFO返回的统计信息
18 DBSIZE 返回所选数据库中的键数量
19 DEBUG OBJECT key 获取有关键的调试信息
20 DEBUG SEGFAULT 使服务器崩溃
21 FLUSHALL 从所有数据库中删除所有键
22 FLUSHDB 删除当前数据库中的所有键
23 INFO [section] 获取有关服务器的信息和统计信息
24 LASTSAVE 获取上次成功保存到磁盘的UNIX时间戳
25 MONITOR 监听服务器实时接收的所有请求
26 ROLE 返回实例在复制上下文中的角色
27 SAVE 将数据集同步保存到磁盘
28 SHUTDOWN [NOSAVE] [SAVE] 将数据集同步保存到磁盘,然后关闭服务器
29 SLAVEOF host port 使服务器成为另一个实例的从属,或将其提升作为主服务器
30 SLOWLOG subcommand [argument] 管理Redis慢查询日志
31 SYNC 用于复制的命令
32 TIME 返回当前服务器的时间