第九讲 redis数据结构

一、Redis基础知识

redis的客户端和服务端命令:
redis-server :服务器命令
启动一个redis的命令是:redis-server redis.windows.conf
redis-cli:客户端命令
启动一个客户端的redis命令:redis-cli -p 6379
一个redis.windows.conf配置就是一个redis服务器。需要启动多个服务器时,只需要修改一下这个配置文件redis.windows.conf的名称,更改端口号,再用redis-server就可以启动。
要求:启动一个端口号在6380上的redis服务器。
1.创建配置文件如下:

2、在配置文件中,该端口号

3、用如下命令启动

4、验证:

1、redis和memcached相比,的独特之处:
redis可以用来做存储(storge),也就是redis可以将数据持久化到硬盘。 而memccached是用来做缓存(cache) 这个特点主要因为其有”持久化”的功能.
存储的数据有”结构”,对于memcached来说,存储的数据,只有1种类型–”字符串”, 而redis则可以存储字符串,链表,哈希结构,集合,有序集合.
2、redis的优点
读写速度快. 数据存放在内存中,数据结构类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
支持丰富的数据类型,string,hash,list,set,sorted
支持简单事务,watch
丰富的特性:可以用于缓存,消息队列,按key设置过期时间,到期后自动删除
支持数据持久化(将内存数据持久化到磁盘),支持AOF和RDB两种持久化方式,从而进行数据恢复操作,可以有效地防止数据丢失
支持主从(master-slave)复制来实现数据备份,主机会自动将数据同步到从机

2、Redis目录下的重要文件的意义:
redis-benchmark 性能测试工具
redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复)
redis-check-dump 快照文件检测工具,效果类上
redis-cli 客户端
redis-server 服务端
redis.windows.conf redis配置文件,在启动redis服务器的时候,必须要指定配置文件,那么相当于于一个配置文件就是一个redis数据库服务器。
redis服务器启动命令:
redis-server redis.windows.conf
3、redis基础命令:
keys * //返回键(key)
keys list* //返回名以list开头的所有键(key)
exists list1 //判断键名为list1的是否存在 存在返回1, 不存在返回0
del list1 //删除一个键(名为list1)
expire list1 10 //设置键名为list1的过期时间为10秒后
ttl list1 //查看键名为list1的过期时间,若为-1表示已过期 或 永不过期
move age 1 //将键名age的转移到1数据库中。
select 1 //表示进入到1数据库中,默认在0数据库
persist age //移除age的过期时间。
flushdb:删除所有的数据 清除当前所在库的所有数据
flushall 清空所有数据
二、redis数据类型
(一)String字符串
set
get
mset
mget
setnx
msetnx
incr
decr
incrby
decrby
setrange
getrange

set方法:设置key对应的值为string类型的value,如果该key已经存在,则覆盖key对应的value值。所以在redis中key只能有一个。
127.0.0.1:6379> set name lijie
get:根据key获取value值
127.0.0.1:6379> get name
Setnx:设置一个不存的字符串,返回0 表示设置失败,已存在。返回1 表示设置新值成功,nx是not exist的意思。
127.0.0.1:6379> setnx name zs
(integer) 0
127.0.0.1:6379> setnx age 20
(integer) 1
setex:设置字符串,同时设置有效期。ex—expire(有效期)
127.0.0.1:6379> setex color 10 red
OK
立即查询
127.0.0.1:6379> get color"red"
10秒后查询
127.0.0.1:6379> get color
(nil)
Setrange:替换字符串。
setrange 替换什么 从哪里开始(0) 替换成什么

127.0.0.1:6379> set email jalja@sina.com
OK
127.0.0.1:6379> get email
“jalja@sina.com”
127.0.0.1:6379> setrange email 6 163.com
(integer) 14
127.0.0.1:6379> get email
“jalja@163.comm”
Mset:一次设置多个key-value,返回OK表示全部设置成功,返回0表示全部失败。如果存在则替换。m–multi
127.0.0.1:6379> mset name1 zs name2 ls
OK
127.0.0.1:6379> get name1
“zs”
127.0.0.1:6379> get name2
“ls”
msetnx:一次设置多个不存在的key-value,返回1表示全部设置成功,返回0表示全部失败。
127.0.0.1:6379> msetnx name3 kk name4 mm name2 LL
(integer) 0
127.0.0.1:6379> get name3
(nil)
127.0.0.1:6379> get name4
(nil)
getset:获取原值,并设置新值
127.0.0.1:6379> getset name4 UU
(nil)
127.0.0.1:6379> get name4
“UU”
127.0.0.1:6379> getset name4 RR
“UU”
getrange:获取key对应value的子字符串
127.0.0.1:6379> get email
“jalja@163.comm”
127.0.0.1:6379> getrange email 0 4
“jalja”
mget:一次获取多个key对应的value值,不存在返回nil
127.0.0.1:6379> mget name1 name2 name3 name4 name5

  1. “zs”
  2. “ls”
  3. (nil)
  4. “RR”
  5. (nil)
    incr:对key对应的value做加1操作,并返回新值
    127.0.0.1:6379> get age
    “20”
    127.0.0.1:6379> incr age
    (integer) 21
    incrby:与incr类似,加指定值,key不存在的时候会设置key,并认为该key原来的value=0
    127.0.0.1:6379> get age
    “21”
    127.0.0.1:6379> incrby age 9
    (integer) 30
    127.0.0.1:6379> incrby age -5
    (integer) 25
    127.0.0.1:6379> incrby height 10
    (integer) 10
    decr:对key对应的value做减1操作
    127.0.0.1:6379> get height
    “10”
    127.0.0.1:6379> decr height
    (integer) 9
    127.0.0.1:6379> decr height
    (integer) 8
    decrby:对key对应的value减去指定的值
    127.0.0.1:6379> get height
    “8”
    127.0.0.1:6379> decrby height 3
    (integer) 5
    127.0.0.1:6379> decrby height -3
    (integer) 8
    append:对key对应的vlaue字符串追加,返回新字符串的长度
    127.0.0.1:6379> get name1
    “zs”
    127.0.0.1:6379> append name1 ML
    (integer) 4
    127.0.0.1:6379> get name1
    “zsML”
    strlen:获取key对应value的长度
    127.0.0.1:6379> get name1
    “zsML”
    127.0.0.1:6379> strlen name1
    (integer) 4
    (二)Hash类型
    Redis hash 是一个string类型的filed和value的映射表、它的添加、删除操作都是0、1(平均操作)。Hash特别适合存储对象。相较于对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便存取整个对象。
    1、hset:设置hash filed 为指定值,如果key不存在,则先创建。key存在则替换
    127.0.0.1:6379> hset user:001 name zs
    (integer) 1
    127.0.0.1:6379> hget user:001 name
    “zs”
    #设置一个user:001 的用户的name为zs(可以将user:001看做一个表)
    2.hget:获取指定field字段的值
    127.0.0.1:6379> hget user:001 name
    (nil)
    3、 hsetnx:设置hash filed 为指定值,如果key不存在,则先创建。如果存在则返回0表示设置失败。
    127.0.0.1:6379> hsetnx user:001 name ML
    (integer) 0
    127.0.0.1:6379> hsetnx user:001 age 1
    (integer) 1
    3、hmset:同时设置hash的多个file
    127.0.0.1:6379> hmset user:002 name MM age 20
    OK
    127.0.0.1:6379> hget user:002 name
    “MM”
    127.0.0.1:6379> hget user:002 age
    “20”
    4、hmget:获取全部指定的hash filed,必须指定获取的key的名称
    127.0.0.1:6379> hmget user:002 name age
  6. “MM”
  7. “20”
    5、hincrby:对hash filed加上指定的值
    127.0.0.1:6379> hget user:002 age
    “20”
    127.0.0.1:6379> hincrby user:002 age 5
    (integer) 25
    127.0.0.1:6379> hincrby user:002 age -5
    (integer) 20
    6、hexists:测试指定的filed是否存在,返回1表示存在,返回0表示不存在
    127.0.0.1:6379> hexists user:002 name
    (integer) 1
    127.0.0.1:6379> hexists user:002 age
    (integer) 1
    127.0.0.1:6379> hexists user:002 height
    (integer) 0
    7、hlen:返回指定hash的field的数量
    127.0.0.1:6379> hlen user:002
    (integer) 2
    8、hdel 删除指定hash 的filed字段,返回1表示删除成功0:表示删除失败
    127.0.0.1:6379> hget user:002 age
    “20”
    127.0.0.1:6379> hdel user:002 age
    (integer) 1
    127.0.0.1:6379> hdel user:002 age
    (integer) 0
    127.0.0.1:6379> hget user:002 age
    (nil)
    9、hkeys:返回hash 的所有filed
    127.0.0.1:6379> hkeys user:001
  8. “name”
  9. “age”
    127.0.0.1:6379> hkeys user:002
  10. “name”
    10、hvals:返回hash的所有value
    127.0.0.1:6379> hvals user:001
  11. “zs”
  12. “1”
    127.0.0.1:6379> hvals user:002
  13. “MM”

(三)List类型
List是一个链表结构,主要功能是push、pop,获取一个范围的所有值等等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作链表的头部或者链表尾部添加元素,这样list既可以作为栈,又可以作为队列。
1、lpush:在key对应list的头部添加字符串元素,返回list中元素的个数
127.0.0.1:6379> lpush list1 “hello”
(integer) 1
127.0.0.1:6379> lpush list1 “word”
(integer) 2
2、lrange:获取list中的元素,
127.0.0.1:6379> lrange list1 0 -1(0:第一个,-1:最后一个)

  1. “word”
  2. “hello”
    3、rpush:在key对应的list尾部添加元素
    127.0.0.1:6379> rpush list2 10
    (integer) 1
    127.0.0.1:6379> rpush list2 11
    (integer) 2
    127.0.0.1:6379> lrange list2 0 -1
  3. “10”
  4. “11”
    4、linsert:在key对应list的特定位置前或后添加字符串
    127.0.0.1:6379> lrange list2 0 -1
  5. “10”
  6. “11”
    127.0.0.1:6379> linsert list2 before 11 10.5
    (integer) 3
    127.0.0.1:6379> linsert list2 after 11 11.5
    127.0.0.1:6379> lrange list2 0 -1
  7. “10”
  8. “10.5”
  9. “11”
    4)“11.5”
    5、lset:更改list中指定下标的元素,返回ok表示设置成功
    127.0.0.1:6379> lrange list2 0 -1
  10. “10”
  11. “10.5”
  12. “11”
    127.0.0.1:6379> lset list2 1 10.00
    OK
    127.0.0.1:6379> lrange list2 0 -1
  13. “10”
  14. “10.00”
  15. “11”
    6、lrem:从key对应list中删除n个和value相同的元素(n<0 从尾部删除,n=0 全部删除,n>0从头部删除。)
    127.0.0.1:6379> lrange list 0 -1
  16. “two”
  17. “one”
  18. “one”
    127.0.0.1:6379> lrem list 1 one
    (integer) 1
    127.0.0.1:6379> lrange list 0 -1
  19. “two”
  20. “one”
    7、ltrim:保留list中指定范围的数据,其他的都不要了
    127.0.0.1:6379> lrange list2 0 -1
  21. “10”
  22. “10.00”
  23. “11”
  24. “12”
    127.0.0.1:6379> ltrim list2 1 2
    OK
    127.0.0.1:6379> lrange list2 0 -1
  25. “10.00”
  26. “11”
    8、lpop:从list的头部删除元素,并返回该元素
    127.0.0.1:6379> lrange list 0 -1
  27. “two”
  28. “one”
    127.0.0.1:6379> lpop list
    “two”
    127.0.0.1:6379> lrange list 0 -1
  29. “one”
    9、rpop:从list尾部删除元素,并返回该元素
    10、rpoplpush:从第一个list的尾部删除元素,并添加到第二个list的头部
    127.0.0.1:6379> lrange list 0 -1
  30. “one”
    127.0.0.1:6379> lrange list1 0 -1
  31. “word”
  32. “hello”
    127.0.0.1:6379> rpoplpush list1 list
    “hello”
    127.0.0.1:6379> lrange list 0 -1
  33. “hello”
  34. “one”
    127.0.0.1:6379> lrange list1 0 -1
  35. “word”
    11、lindex 返回名称为key的list中index位置的元素<===>list[index]
    127.0.0.1:6379> lrange list 0 -1
  36. “hello”
  37. “one”
    127.0.0.1:6379> lindex list 1
    “one”
    12、llen:返回指定key对应list的长度<====> len(list)
    127.0.0.1:6379> lrange list 0 -1
  38. “hello”
  39. “one”
    127.0.0.1:6379> llen list
    (integer) 2
    (三)Sets类型
    Set是一个string类型的无序集合,不允许重复。Set是通过hash table实现的。添加、删除、查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集。
    1、 sadd:向key对应的set集合中添加元素,返回1表示添加成功,返回0 表示失败
    127.0.0.1:6379> sadd myset1 one
    (integer) 1
    127.0.0.1:6379> sadd myset1 two
    (integer) 1
    2、 Smembers:查看set集合中的元素
    127.0.0.1:6379> smembers myset1
  40. “two”
  41. “one”
    3、srem:删除key对应set集合中的元素,返回1表示删除成功 0表示失败
    127.0.0.1:6379> srem myset1 two
    (integer) 1
    4、spop:随机删除set中的一个元素并返回该元素
    127.0.0.1:6379> smembers myset1
  42. “three”
  43. “one”
  44. “four”
    127.0.0.1:6379> spop myset1
    “four”
    127.0.0.1:6379> smembers myset1
  45. “three”
  46. “one”
    5、sdiff:返回给定set集合的差集 (以在前的set集合为标准)
    127.0.0.1:6379> smembers myset1
  47. “three”
  48. “one”
    127.0.0.1:6379> smembers myset2
  49. “two”
  50. “one”
    127.0.0.1:6379> sdiff myset1 myset2
  51. “three”
    127.0.0.1:6379> sdiff myset2 myset1
  52. “two”
    6、sdiffstore:返回所有给定set集合的差集,并将差集添加到另外一个集合中
    127.0.0.1:6379> smembers myset1
  53. “three”
  54. “one”
    127.0.0.1:6379> smembers myset2
  55. “two”
  56. “one”
    127.0.0.1:6379> sdiffstore myset3 myset1 myset2
    (integer) 1
    127.0.0.1:6379> smembers myset3
  57. “three”
    7、sinter:返回所有给定集合的交集
    127.0.0.1:6379> smembers myset1
  58. “three”
  59. “one”
    127.0.0.1:6379> smembers myset2
  60. “two”
  61. “one”
    127.0.0.1:6379> sinter myset1 myset2
  62. “one”
    8、sinterstore:返回所有给定集合key的交集,并将结果存为另一个key
    127.0.0.1:6379> smembers myset1
  63. “three”
  64. “one”
    127.0.0.1:6379> smembers myset2
  65. “two”
  66. “one”
    127.0.0.1:6379> sinterstore myset4 myset1 myset2
    (integer) 1
    9、sunion 返回所有给定集合的并集
    127.0.0.1:6379> smembers myset1
  67. “three”
  68. “one”
    127.0.0.1:6379> smembers myset2
  69. “two”
  70. “one”
    127.0.0.1:6379> sunion myset1 myset2
  71. “three”
  72. “two”
  73. “one”
    10、sunionstore 返回所有给定集合的并集,并将结果存入另一个集合
    127.0.0.1:6379> smembers myset1
  74. “three”
  75. “one”
    127.0.0.1:6379> smembers myset2
  76. “two”
  77. “one”
    127.0.0.1:6379> sunionstore myset5 myset1 myset2
    (integer) 3
    11、smove:从第一个集合中移除元素并将该元素添加到另一个集合中。
    127.0.0.1:6379> smembers myset1
  78. “three”
  79. “one”
    127.0.0.1:6379> smembers myset5
  80. “three”
  81. “two”
  82. “one”
    127.0.0.1:6379> smove myset5 myset1 two
    (integer) 1
    127.0.0.1:6379> smembers myset5
  83. “three”
  84. “one”
    127.0.0.1:6379> smembers myset1
  85. “three”
  86. “two”
  87. “one”
    12、Scard:返回set集合中元素的个数 llen(list) strlen (str) hlen(hash)
    127.0.0.1:6379> smembers myset1
  88. “three”
  89. “two”
  90. “one”
    127.0.0.1:6379> scard myset1
    (integer) 3
    13、sismember:测试member元素是否是名称为key的set集合 返回1:表示是 0:不是
    127.0.0.1:6379> smembers myset1
  91. “three”
  92. “two”
  93. “one”
    127.0.0.1:6379> sismember myset1 tree
    (integer) 0
    127.0.0.1:6379> sismember myset1 three
    (integer) 1
    14、srandmember:随机返回set集合中的一个元素,但不删除该元素
    127.0.0.1:6379> smembers myset1
  94. “three”
  95. “two”
  96. “one”
    127.0.0.1:6379> srandmember myset1
    “one”

(四)Sorted set (zset)类型
Sorted set是set的一个升级版,他在set的基础上增加了一个顺序属性,这一属性在添加元素的时候可以指定,每次指定后,zset会自动重新按新的值挑战顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。操作key理解为zset的名字
1、zadd:向有序集合zset中添加元素并指定顺序,如果该元素已存在就更新元素顺序。
127.0.0.1:6379> zadd myzset1 1 one
(integer) 1
127.0.0.1:6379> zadd myzset1 2 two
(integer) 1
2、zrange:从zset集合中取元素 [withscores] 输出元素顺序号
127.0.0.1:6379> zadd myzset1 1 one
(integer) 1
127.0.0.1:6379> zadd myzset1 2 two
(integer) 1
127.0.0.1:6379> zrange myzset1 0 -1 withscores

  1. “one”
  2. “1”
  3. “two”
  4. “2”
    3、zrem:删除zset集合中指定的元素
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  5. “one”
  6. “1”
  7. “two”
  8. “2”
    127.0.0.1:6379> zrem myzset1 two
    (integer) 1
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  9. “one”
  10. “1”
    4、zincrby:若zset中已经存在元素member、则该元素的score增加incrment否则向该集合中添加该元素,其score的值为increment
    例:改变myset1中one元素的顺序值
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  11. “one”
  12. “1”
    127.0.0.1:6379> zincrby myzset1 2 one
    “3”
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  13. “one”
  14. “3”
    5、zrank:返回zset中元素member的排名(score从小到大排序)即索引下标
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  15. “one”
  16. “3”
  17. “four”
  18. “4”
  19. “five”
  20. “5”
    127.0.0.1:6379> zrank myzset1 four
    (integer) 1
    5、zrevrank:返回zset集合中member元素的排名(按照score倒叙)即下标
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  21. “one”
  22. “3”
  23. “four”
  24. “4”
  25. “five”
  26. “5”
    127.0.0.1:6379> zrevrank myzset1 four
    (integer) 1
    127.0.0.1:6379> zrevrank myzset1 five
    (integer) 0
    6、zrevrange:从zset集合中倒叙(score倒叙)获取元素
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  27. “one”
  28. “3”
  29. “four”
  30. “4”
  31. “five”
  32. “5”
    127.0.0.1:6379> zrevrange myzset1 0 -1 withscores
  33. “five”
  34. “5”
  35. “four”
  36. “4”
  37. “one”
  38. “3”
    8、zrangebyscore:从zset集合中根据score顺序获取元素
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  39. “one”
  40. “3”
  41. “four”
  42. “4”
  43. “five”
  44. “5”
    127.0.0.1:6379> zrangebyscore myzset1 4 5 withscores
  45. “four”
  46. “4”
  47. “five”
  48. “5”
    9、zcount:返回集合中score在给定区间的数量
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  49. “one”
  50. “3”
  51. “four”
  52. “4”
  53. “five”
  54. “5”
    127.0.0.1:6379> zcount myzset1 3 4
    (integer) 2
    10:zcard:返回zset集合中所有元素个数
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  55. “one”
  56. “3”
  57. “four”
  58. “4”
  59. “five”
  60. “5”
    127.0.0.1:6379> zcard myzset1
    (integer) 3
    12、zremrangebyrank:删除集合中排名(下标)在给定区间的元素
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  61. “one”
  62. “3”
  63. “four”
  64. “4”
  65. “five”
  66. “5”
    127.0.0.1:6379> zremrangebyrank myzset1 1 2
    (integer) 2
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  67. “one”
  68. “3”
    12、zremrangebyscore::删除集合中顺序(score值)在给定区间的元素
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  69. “one”
  70. “3”
  71. “four”
  72. “4”
  73. “five”
  74. “5”
    127.0.0.1:6379> zremrangebyscore myzset1 3 4
    (integer) 2
    127.0.0.1:6379> zrange myzset1 0 -1 withscores
  75. “five”
  76. “5”
    rank是指下标索引:他是从0开始的
    score是指分数。

一、Redis事物及乐观锁
1、Redis支持简单的事务
2、Redis与 mysql事务的对比
Mysql
Redis
开启
start transaction
muitl
语句
普通sql
普通命令
失败
rollback 回滚
discard 取消
成功
commit
exec
redis的事务,在用multi开启之后,之后输入的所有命令,其实都是将其添加到一个执行队列中,当使用exec这个命令时,这个队列中的命令就会按顺序执行,使用discard这个命令式,这个队列就会被清空。
注: rollback与discard 作用:
discard和rollback都可以做到回滚。但是dicard其实就是将开启事物后的队列里面的命令清空。rollback是真正的回滚,就是回到开启事务之前的状态。
3、在mutil后面的语句中, 语句出错可能有2种情况:
(1)语法就有问题,此时,在输入命令时,就会报错。
(2)语法本身没错,但适用对象有问题. 比如 zadd 操作list对象,这个命令也会被加入队列。exec之后,出错的那个命令之前的命令是会被执行的

相当于只要事务的所有命令中出现任何语法错误,在exec时都会回滚,所有命令都不会执行。

4、乐观锁
思考:我正在买票,Ticket = 1, money =100,而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了—即ticket变成0了。我该如何观察这种情景,并不再提交。
悲观的想法:
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]
乐观的想法:
没有那么人和我抢,因此,我只需要注意,有没有人更改ticket的值就可以了 [乐观锁]
Redis的事务中,启用的是乐观锁,只负责监测key没有被改动
具体的命令---- watch命令
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
redis 127.0.0.1:6379> exec
(nil) // 返回nil,说明监视的ticket已经改变了,事务就取消了.
redis 127.0.0.1:6379> get ticket
“0”
redis 127.0.0.1:6379> get money
“200”
步骤:
创建ticket和money 字符串,分别是1和100
打开两个客户端:一个客户端执行上述代码,另一个客户端在exec之前,更改一下ticket的值。

watch key1 key2 … keyN
作用:监听key1 key2…keyN有没有变化,如果有变, 则事务取消
unwatch
作用: 取消所有watch监听
二、消息订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端。

使用办法:
订阅端: Subscribe 频道名称
发布端: publish 频道名称 发布内容
客户端例子:
redis 127.0.0.1:6379> subscribe news
Reading messages… (press Ctrl-C to quit)

  1. “subscribe”
  2. “news”
  3. (integer) 1
  4. “message”
  5. “news”
  6. “good good study”
  7. “message”
  8. “news”
  9. “day day up”

服务端例子:
redis 127.0.0.1:6379> publish news ‘good good study’
(integer) 1
redis 127.0.0.1:6379> publish news ‘day day up’
(integer) 1
消息的意义:建立客户端之间的通信
client1 :处理计算的第一步
client2:处理计算的第二步
client3:处理计算的最后一步
client1—>将计算结果当成一个消息发送client2
三、Redis持久化配置
持久化:将内存中的数据保存到硬盘上。
序列化:就对象保存到硬盘上。
redis是一个内存数据库,他最大的特点就是可以将内存的上的数据持久化的硬盘。这是为了保证数据在系统重启或者电脑电源关闭,数据不会被丢失。
当redis启动的启动的时候,他会将硬盘的数据,全部加载到内存,在内存上运行。

redis持久化是通过两种方式来完成的:

RDB快照
日志
(一)RDB快照
Rdb快照的配置选项:
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
(这3个选项都屏蔽,则rdb禁用)
和持久化相关的redis配置:
stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入?
rdbcompression yes // 导出的rdb文件是否压缩
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径
(二)aof日志
Aof 的配置:
appendonly no # 是否打开 aof日志功能
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof. 同步频率低,速度快。
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
两种持久化机制的比较:
RDB持久化
AOF持久化
全量备份,一次保存整个数据库
增量备份,一次保存一个修改数据库的命令
保存的间隔较长
保存的间隔默认一秒
数据还原速度快
数据还原速度一般
save会阻塞,但bgsave或者自动不会阻塞
无论是平时还是AOF重写,都不会阻塞
更适合数据备份,默认开启
更适合用来保存数据,和一般SQL持久化方式一样,默认关闭
启动优先级 : 低
启动优先级 : 高
体积 : 小
体积 : 大
恢复速度 : 快
恢复速度 : 慢
数据安全性 : 丢数据
数据安全性 : 根据策略决定
轻重 : 重
轻重: 轻
(三)redis持久化相关的问题
1、在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.

2、aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里。题。以解决 aof日志过大的问。

3、如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整。

4、 2种是否可以同时用?
答: 可以,而且推荐这么做

5、恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
四、Redis主从复制(集群)
1、集群的作用:
主从备份----防止主机宕机
读写分离----分担master 的任务
任务分离----如从服分别分担备份工作与计算工作
集群布局1: 集群布局2:

第二种方案有一个好处:master宕机后,可以直接切换到slave1
2、主从通信过程

步骤:

salve会自动的发送一个同步的指令并连接master。
master收到同步指令后,会dump rdb(内存镜像),并传送给slave,slave拿到整块的内存镜像塞到自己的内存中。
如果在dump rdb的过程中,master中还有新的操作命令对其操作,那么这些命令将会缓存到aof日志中,dump结束后就统一发送给slave。
此后,如果master再改变,就由一个叫:replicationFeedSlaves的进程去维护之间数据的同步。
3、主从配置

主服务器:

rdb禁用
#save 900 1
#save 300 10
#save 60 1000
aof打开
appendonly yes
从服务器:
设置端口
port 6380
有一台启用rdb
两台都禁用aof
设置slave-of
slaveof localhost 6379

redis-server redis.windows.conf --maxheap 200m
redis-server redis.windows6380.conf --maxheap 200m
redis-server redis.windows6381.conf --maxheap 200m

启动客户端:

redis-cli
redis-cli -p 6380
redis-cli -p 6381

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值