1. 安装

wget http://download.redis.io/releases/redis-5.0.4.tar.gz 下载最新版本
tar -zxvf redis-5.0.4.tar.gz 解压源码
cd redis-5.0.4 进入目录
make 配置

2. 配置说明

启动方式: ./redis-server ../redis.conf

  • redis.conf 配置文件
  • daemonize no Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
  • pidfile /var/run/redis.pid 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
  • port 6379 指定Redis监听端口,默认端口为6379
  • bind 127.0.0.1 绑定的主机地址
  • timeout 300 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
  • loglevel verbose 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
  • logfile stdout 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
  • databases 16 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
  • save <seconds> <changes> 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合, save 900 1,save 300 10,save 60 10000 ,分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
  • rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
  • dbfilename dump.rdb 指定本地数据库文件名,默认值为dump.rdb
  • dir ./ 指定本地数据库存放目录
  • slaveof <masterip> <masterport> 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
  • masterauth <master-password> 当master服务设置了密码保护时,slav服务连接master的密码
  • requirepass foobared 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
  • maxclients 128 设置同一时间最大客户端连接数,默认无限制
  • maxmemory <bytes> 指定Redis最大内存限制
  • appendonly no 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
  • appendfilename appendonly.aof 指定更新日志文件名,默认为appendonly.aof
  • appendfsync everysec 指定更新日志条件,共有3个可选值:no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) ,everysec:表示每秒同步一次(折中,默认值)
  • vm-enabled no 指定是否启用虚拟内存机制,默认值为no,
  • vm-swap-file /tmp/redis.swap 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
  • vm-max-memory 0 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
  • vm-page-size 32 Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
  • vm-pages 134217728 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
  • vm-max-threads 4 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
  • glueoutputbuf yes 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
  • hash-max-zipmap-entries 64hash-max-zipmap-value 512
  • activerehashing yes 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
  • include /path/to/local.conf 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

访问方式:redis-cli -h 192.168.1.27 -p 6379
关闭服务:redis-cli shutdown

3. 数据类型介绍

基本类型:字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
范围查询类型: bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询

  • 二进制安全的字符串
  • Lists: 按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)。
  • Sets: 不重复且无序的字符串元素的集合。
  • Sorted sets,类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。
  • Hashes,由field和关联的value组成的map。field和value都是字符串的。这和Ruby、Python的hashes很像。
  • Bit arrays (或者说 simply bitmaps): 通过特殊的命令,你可以将 String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。
  • HyperLogLogs: 这是被用于估计一个 set 中元素数量的概率性的数据结构。

3. 命令

1.键(key)

1、del:如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

DEL key [key ...]

2、dump:序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。

DUMP key

3、restore:反序列化给定的序列化值,并将它和给定的 key 关联。

RESTORE key ttl "\x00\x04liao\t\x00\xb4\xa8\xbb\xf1\x01C\x1b\xf6"

4、exists:返回key是否存在。1 如果key存在,0 如果key不存在

EXISTS key [key ...]

5、keys:查找所有符合给定模式pattern(正则表达式)的 key 。

KEYS pattern

6、expire(pexpire 毫秒):设置key的过期时间,超过时间后,将会自动删除该key。在Redis的术语中一个key的相关超时是不确定的。1 如果成功设置过期时间。0 如果key不存在或者不能设置过期时间。

EXPIRE key 10

7、expireat(pexpireat 毫秒): 的作用和 EXPIRE类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳 Unix timestamp 。

EXPIREAT key 1293840000

8、migrate: 将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。

migrate ip port key | destination-db timeout [copy] [replace] [keys key]

9、move: 将当前数据库的 key 移动到给定的数据库 db 当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1,失败则返回 0

move key db、move name 2

10、object: OBJECT 命令可以在内部调试(debugging)给出keys的内部对象,它用于检查或者了解你的keys是否用到了特殊编码 的数据类型来存储空间z。 当redis作为缓存使用的时候,你的应用也可能用到这些由OBJECT命令提供的信息来决定应用层的key的驱逐策略(eviction policies)

OBJECT subcommand [arguments [arguments ...]]
lpush mylist "Hello World"
object refcount mylist
object encoding mylist
object idletime mylist
  • OBJECT 命令可以在内部调试(debugging)给出keys的内部对象,它用于检查或者了解你的keys是否用到了特殊编码 的数据类型来存储空间z。 当redis作为缓存使用的时候,你的应用也可能用到这些由OBJECT命令提供的信息来决定应用层的key的驱逐策略(eviction policies)
  • OBJECT ENCODING 该命令返回指定key对应value所使用的内部表示(representation)(译者注:也可以理解为数据的压缩方式).
  • OBJECT IDLETIME 该命令返回指定key对应的value自被存储之后空闲的时间,以秒为单位(没有读写操作的请求) ,这个值返回以10秒为单位的秒级别时间,这一点可能在以后的实现中改善

11、persist: 移除给定key的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。

SET mykey "Hello"
EXPIRE mykey 10
TTL mykey
PERSIST mykey
TTL mykey

12、ttl(pttl 毫秒): 返回key剩余的过期时间

TTL mykey

13、randomkey: 从当前数据库返回一个随机的key。

randomkey

14、rename: 将key重命名为newkey,如果key与newkey相同,将返回一个错误。如果newkey已经存在,则值将被覆盖。

RENAME mykey myotherkey

15、renamenx: 当且仅当 newkey 不存在时,将 key 改名为 newkey 。当 key 不存在时,返回一个错误。

RENAMENX mykey myotherkey

16、scan: 它们每次执行都只会返回少量元素,所以这些命令可以用于生产环境,而不会出现像 KEYS 或者 SMEMBERS 命令带来的可能会阻塞服务器的问题。

SCAN cursor [MATCH pattern] [COUNT count]

17、touch: 修改指定key(s) 最后访问时间 若key不存在,不做操作

TOUCH key [key ...]

18、unlink:该命令和DEL十分相似:删除指定的key(s),若key不存在则该key被跳过。但是,相比DEL会产生阻塞,该命令会在另一个线程中回收内存,因此它是非阻塞的。 这也是该命令名字的由来:仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。

UNLINK key [key ...]
2.字符串(string)

1、append:如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。返回append后字符串值(value)的长度。

APPEND key value

2、bitcount:统计字符串被设置为1的bit数.

BITCOUNT key [start end]

3、decr/incr:对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。

DECR key

4、decrby/incrby:将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。

DECRBY mykey 5/DECRBY mykey 5

5、get:返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。

GET mykey

6、getbit:返回key对应的string在offset处的bit值 当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间.

GETBIT mykey 100

7、getrange:这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。

GETRANGE key start end

8、getset:自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。返回之前的旧值,如果之前Key不存在将返回nil。

INCR mycounter
GETSET mycounter "0"
GET mycounter

9、mget:返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil。正因为此,这个操作从来不会失败。

MGET key1 key2 nonexisting

10、mset:对应给定的keys到他们相应的values上。MSET会用新的value替换已经存在的value,就像普通的SET命令一样。如果你不想覆盖已经存在的values,请参看命令MSETNX。

MSET key1 "Hello" key2 "World"

11、msetnx:对应给定的keys到他们相应的values上。只要有一个key已经存在,MSETNX一个操作都不会执行。 由于这种特性,MSETNX可以实现要么所有的操作都成功,要么一个都不执行,这样可以用来设置不同的key,来表示一个唯一的对象的不同字段。

MSETNX key1 "Hello" key2 "there"

12、set:将键key设定为指定的“字符串”值。如果key已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。当set命令执行成功之后,之前设置的过期时间都将失效

SET key value [EX seconds] [PX milliseconds] [NX|XX]
set phone xiaomi ex 50

13、setbit:设置或者清空key的value(字符串)在offset处的bit值。

SETBIT mykey 7 1

14、setex:设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。这个命令等效于执行下面的命令:

SET mykey value
EXPIRE mykey seconds
SETEX mykey 10 "Hello"
3.列表(list)

1、blpop/brpop:当没有元素的时候会弹出一个 nil 的多批量值,并且 timeout 过期。当有元素弹出时会返回一个双元素的多批量值,其中第一个元素是弹出元素的 key,第二个元素是 value。

BLPOP key [key ...] timeout

2、brpoplpush/rpoplpush:Redis Brpoplpush 命令从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOPLPUSH msg reciver 500/BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT

3、lindex:返回列表里的元素的索引 index 存储在 key 里面。 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素。在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。

LINDEX mylist 0

4、linsert:把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。当 key 存在,但保存的不是一个list的时候,会返回error。

RPUSH mylist "Hello"
(integer) 1
RPUSH mylist "World"
(integer) 2
LINSERT mylist BEFORE "World" "There"
(integer) 3
LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

5、llen:返回存储在 key 里的list的长度。 如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。

LLEN mylist

其他命令:

  • 1、LPOP key 移除并且返回 key 对应的 list 的第一个元素。
  • 2、LPUSH key value [value ...] 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
  • 3、LPUSHX key value 只有当 key 已经存在并且存着一个 list 的时候,在这个 key 下面的 list 的头部插入 value。 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作。
  • 4、LRANGE key start stop 返回存储在 key 的列表里指定范围内的元素。 start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。
  • 5、LREM key count value 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
    count > 0: 从头往尾移除值为 value 的元素。
    count < 0: 从尾往头移除值为 value 的元素。
    count = 0: 移除所有值为 value 的元素
  • 6、LSET key index value 设置 index 位置的list元素的值为 value。
  • 7、LTRIM key start stop 修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。
  • 8、RPOP key 移除并返回存于 key 的 list 的最后一个元素。
  • 9、RPUSH key value [value ...] 向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是一个列表,那么会返回一个错误。
  • 10、RPUSHX key value 将值 value 插入到列表 key 的表尾, 当且仅当 key 存在并且是一个列表。 和 RPUSH 命令相反, 当 key 不存在时,RPUSHX 命令什么也不做。
4.哈希(hash)

1、hdel:从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。

HDEL key field [field ...]

2、hexists:返回hash里面field是否存在

HEXISTS myhash field2

3、hget:返回 key 指定的哈希集中该字段所关联的值

HGET key field

4、hgetall:返回 key 指定的哈希集中所有的字段和值。

HGETALL myhash

5、hincrby/hincrbyfloat:增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0

HINCRBY 支持的值的范围限定在 64位 有符号整数

HINCRBY key field increment
hincrby people age 1

6、hkeys:返回 key 指定的哈希集中所有字段的名字。

HKEYS key

7、hlen:返回 key 指定的哈希集包含的字段的数量。

HLEN key

8、hmget:返回 key 指定的哈希集中指定字段的值。

HMGET key field [field ...]

9、hmset:设置 key 指定的哈希集中指定字段的值。该命令将重写所有在哈希集中存在的字段。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联

HMSET key field value [field value ...]

10、hset:设置 key 指定的哈希集中指定字段的值。

HSET key field value

11、hsetnx:只在 key 指定的哈希集中不存在指定的字段时,设置字段的值。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段已存在,该操作无效果。

HSETNX key field value

12、hstrlen:返回hash指定field的value的字符串长度,如果hash或者field不存在,返回0.

HSTRLEN key field

13、hvals:返回 key 指定的哈希集中所有字段的值。

HVALS key
5.集合(set)

1、sadd:添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.

SADD key member [member ...]

2、scard:返回集合存储的key的基数 (集合元素的数量).

SCARD key

3、sdiff:返回一个集合与给定集合的差集的元素.

SDIFF key [key ...]

4、sdiffstore:该命令类似于 SDIFF, 不同之处在于该命令不返回结果集,而是将结果存放在destination集合中.

如果destination已经存在, 则将其覆盖重写.

SDIFFSTORE destination key [key ...]

5、sinter:返回指定所有的集合的成员的交集.

SINTER key [key ...]

6、sinterstore:这个命令与SINTER命令类似, 但是它并不是直接返回结果集,而是将结果保存在 destination集合中.

SINTERSTORE destination key [key ...]

7、sismember:返回成员 member 是否是存储的集合 key的成员.

SISMEMBER key member

8、smembers:返回key集合所有的元素.该命令的作用与使用一个参数的SINTER 命令作用相同.

SMEMBERS key

9、smove:将member从source集合移动到destination集合中. 对于其他的客户端,在特定的时间元素将会作为source或者destination集合的成员出现.

SMOVE source destination member
SMOVE myset myotherset "two"

10、spop:从存储在key的集合中移除并返回一个或多个随机元素。此操作与SRANDMEMBER类似,它从一个集合中返回一个或多个随机元素,但不删除元素。

SPOP key [count]

11、srandmember:那么随机返回key集合中的一个元素.

SRANDMEMBER key [count]

12、srem:在key集合中移除指定的元素. 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.

SREM key member [member ...]

13、sunion:返回给定的多个集合的并集中的所有成员.

SUNION key [key ...]

14、sunionstore:该命令作用类似于SUNION命令,不同的是它并不返回结果集,而是将结果存储在destination集合中.如果destination 已经存在,则将其覆盖.

SUNIONSTORE destination key [key ...]
6.有序集合(sorted set)

1、zadd:将所有指定成员添加到键为key有序集合(sorted set)里面。 添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。

ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

2、zcard:返回key的有序集元素个数。

ZCARD key

3、zcount:指定分数范围的元素个数。

ZCOUNT key min max

4、zincrby:为有序集key的成员member的score值加上增量increment。如果key中不存在member,就在key中添加一个member,score是increment(就好像它之前的score是0.0)。如果key不存在,就创建一个只含有指定member成员的有序集合

ZINCRBY key increment member

5、zintestore:计算给定的numkeys个有序集合的交集,并且把结果放到destination中。 在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"

6、zpopmax:删除并返回有序集合key中的最多count个具有最高得分的成员。

ZPOPMAX key [count]

7、zpopmin:删除并返回有序集合key中的最多count个具有最低得分的成员。

ZPOPMIN key [count]

8、zrange:返回存储在有序集合key中的指定范围的元素。

ZRANGE key start stop [WITHSCORES]

8、zrevrange:返回存储在有序集合key中的指定范围的元素。其中成员的位置按score值递减(从大到小)来排列。

ZREVRANGE key start stop [WITHSCORES]

9、zrank:返回有序集key中成员member的排名。

ZRANK key member

10、zrevrank:返回有序集key中成员member的排名,其中有序集成员按score值从大到小排列。排名以0为底,也就是说,score值最大的成员排名为0。

ZREVRANK key member

11、zrem:返回的是从有序集合中删除的成员个数,不包括不存在的成员。

ZREM key member [member ...]
7.地图(Geo)

1、geoadd:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

GEOADD key longitude latitude member [longitude latitude member ...]

2、geodist:返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。

GEODIST key member1 member2 [unit]

3、geohash:返回一个或多个位置元素的 Geohash 表示。

GEOHASH key member [member ...]

4、geopos:从key里返回所有给定位置元素的位置(经度和纬度)。

GEOPOS key member [member ...]

5、georadius:以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

6、georadiusbymember:这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
8.HyperLogLog

1、pfadd:将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中.

PFADD key element [element ...]
PFADD hll a b c d e f g

2、pfcount:当参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数,如果该变量不存在,则返回0.

PFCOUNT key [key ...]
PFCOUNT hll

3、pfmerge:将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集.

PFMERGE destkey sourcekey [sourcekey ...]
PFMERGE hll3 hll1 hll2

4、大量数据插入

data.txt文件

SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN

cat data.txt | redis-cli -h localhost -p 6380 -a liao --pipe

unix2dos d1.txt 转码 cat d1.txt | redis-cli -h localhost -p 6380 -a liao [ --pipe ]

5、过期策略

Keys的过期时间 通常Redis keys创建时没有设置相关过期时间。他们会一直存在,除非使用显示的命令移除,例如,使用DEL命令。

EXPIRE一类命令能关联到一个有额外内存开销的key。当key执行过期操作时,Redis会确保按照规定时间删除他们。

key的过期时间和永久有效性可以通过EXPIRE和PERSIST命令(或者其他相关命令)来进行更新或者删除过期时间。

过期精度 在 Redis 2.4 及以前版本,过期期时间可能不是十分准确,有0-1秒的误差。

从 Redis 2.6 起,过期时间误差缩小到0-1毫秒。

过期和持久 Keys的过期时间使用Unix时间戳存储(从Redis 2.6开始以毫秒为单位)。这意味着即使Redis实例不可用,时间也是一直在流逝的。

要想过期的工作处理好,计算机必须采用稳定的时间。 如果你将RDB文件在两台时钟不同步的电脑间同步,有趣的事会发生(所有的 keys装载时就会过期)。

即使正在运行的实例也会检查计算机的时钟,例如如果你设置了一个key的有效期是1000秒,然后设置你的计算机时间为未来2000秒,这时key会立即失效,而不是等1000秒之后。

Redis如何淘汰过期的keys Redis keys过期有两种方式:被动和主动方式。

当一些客户端尝试访问它时,key会被发现并主动的过期。

当然,这样是不够的,因为有些过期的keys,永远不会访问他们。 无论如何,这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。

具体就是Redis每秒10次做的事情:

测试随机的20个keys进行相关过期检测。 删除所有已经过期的keys。 如果有多于25%的keys过期,重复步奏1. 这是一个平凡的概率算法,基本上的假设是,我们的样本是这个密钥控件,并且我们不断重复过期检测,直到过期的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys。

在复制AOF文件时如何处理过期 为了获得正确的行为而不牺牲一致性,当一个key过期,DEL将会随着AOF文字一起合成到所有附加的slaves。在master实例中,这种方法是集中的,并且不存在一致性错误的机会。

然而,当slaves连接到master时,不会独立过期keys(会等到master执行DEL命令),他们任然会在数据集里面存在,所以当slave当选为master时淘汰keys会独立执行,然后成为master。

5、事务

MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证:

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

EXEC 命令负责触发并执行事务中的所有命令:

如果客户端在使用 MULTI 开启了一个事务之后,却因为断线而没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。 另一方面,如果客户端成功在开启事务之后执行 EXEC ,那么事务中的所有命令都会被执行。

放弃事务 当执行 DISCARD 命令时, 事务会被放弃, 事务队列会被清空, 并且客户端会从事务状态中退出:

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

redis 主从分布配置操作步骤详解

主服务器:127.0.0.1 6379 从服务器:127.0.0.1 6380

1、首先,修改 Master上的如下配置(在 redis.conf 修改配置):
a. 禁用 主服务器 snapshot

  • save 900 1 #禁用Snapshot
  • save 300 10
  • save 60 10000

b. 禁用 AOF

  • appendonly no #禁用AOF (该操作默认就是禁用的) c. 设置 master 密码 (可选)
  • requirepass liao

2、修改 Slave(redis6666)上的如下配置:

a. 启动 从服务器的 Snapshot

  • save 900 1 #启用Snapshot (默认开启)
  • save 300 10
  • save 60 10000

b. 启动 从服务器 AOF

  • appendonly yes #启用AOF(默认关闭)
  • appendfilename appendonly.aof #AOF文件的名称

c. 设置 slaveof

  • slaveof 127.0.0.1 6379
  • masterauth liao

查看主服务器连接状态: info replication

四、 备份数据测试
1、 Master 插入一条数据:

127.0.0.1:6666> set name helloworld
OK

2、Slave 获取数据:

127.0.0.1:7777> get name
"helloworld"

操作到这里: redis 主从配置成功了。

五、容灾机制测试
1、Master 挂掉了:

127.0.0.1:6666> SHUTDOWN  # 或者 直接 kill 掉 Master 进程
not connected>

2、 Slave 再次获取数据:

127.0.0.1:7777> get name
"helloworld"

3、数据恢复

先在从服务器执行:save 将Slave上数据文件 dump.rdb 和 appendonly.aof 复制到 Master 目录上。

4、启动 Master ,分别在 Master 和 Slave 获取数据。

注意: 操作步骤3、4 不可互换,否则会造成数据丢失。 Master 启动后,Slave 会自动去同步数据。

Redis的过期策略
我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种:

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
    (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)

Redis中同时使用了惰性过期和定期过期两种过期策略。

Redis的内存淘汰策略
Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

1、前言

最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF持久化(原理是将Reids的操作日志以追加的方式写入文件)。那么这两种持久化方式有什么区别呢,改如何选择呢?网上看了大多数都是介绍这两种方式怎么配置,怎么使用,就是没有介绍二者的区别,在什么应用场景下使用。

2、二者的区别

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

3、二者优缺点

RDB存在哪些优势呢?

1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB又存在哪些劣势呢?

1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

AOF的优势有哪些呢?

1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

AOF的劣势有哪些呢?

1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。不过生产环境其实更多都是二者结合使用的。

4、常用配置

RDB持久化配置

Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:

save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

AOF持久化配置

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no #从不同步。高效但是数据不会被持久化。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""