Redis

2022.1.14整理完毕

NoSQL指的是“not only SQL”,不仅仅是SQL

现在一般统指:一系列非 关系型数据库 MongoDB、redis、HBASE、hiving、es、solr……

这些数据库的特点是:不再使用表做完存储单元,一般都是使用Json这种灵活的类型存储数据

一、安装

1.windows安装

压缩版

直装版

注册为服务

默认端口6379

2.Linux安装

3.启动

win压缩版或Linux版启动

  1. redis-server # 开启服务
  2. redis-cli # 进入数据库,没有密码

以下操作是为了让Redis开机自启

window注册为服务

  1. redis-server --service-install g://mytools/redis/redis-window-server.conf

Linux

  1. # 修改配置
  2. # 将redis-server.conf 文件中的daemonize修改为yes
  3. vim redis-server.conf
  4. daemonize yes

二、配置文件

三、数据类型

Redis中存在5种最基本的数据类型

  1. String
  2. hash
  3. list
  4. set
  5. zset

Redis在后期版本扩展了很多新的特性

  1. range queries
  2. bitmaps
  3. hyperloglogs
  4. geospatial indexes
  5. streams

1.String类型

配合 Ctrl+F 快速搜索定位自己想要的东西

  1. set key value # 设置一个键值对
  2. get key # 通过key获取值
  3. mset key value [key value……] # 设置多个键值对
  4. mget key [key……] # 通过key获取多个键值对
  5. setex key second value # 设置一个键值对,同时指定超时时间
  6. setnx key value # 如果键值对不存在,则增加键值对,如果存在,则没有变化
  7. setrange key offset value # 从key的值对应的位置开始替换字符串的值
  8. getrange key start end # 获取[start, end]区间范围内的字符串,如果想要获取全部,可以end设置为-1
  9. incr key # 对key对应的值加一
  10. decr key # 对key对应的值减一
  11. incrby key increment # 对key对应的值加N
  12. decrby key increment # 对key对应的值减N
  13. =====key操作命令=====
  14. expire key second # 给已经存在的键值对设置超时时间
  15. ttl key # 获取key的有效时间,如果为正数,则表示失效的秒数,如果是-1,则表示永久有效,如果是-2,则表示失效(也就是没有个键值对)
  16. keys * # 查看当前数据库下所有的key
  17. exists key # 判断某个key是否存在
  18. type key # 判断key存储的数据的数据类型
  19. del key # 删除键值对

set key value

设置一个键值对

  1. 127.0.0.1:6379[1]> set name sanshisi
  2. OK
  3. 127.0.0.1:6379[1]> keys *
  4. 1) "name"

get key

通过key获取值

  1. 127.0.0.1:6379[1]> get name
  2. "sanshisi"

mset key value [key value……]

设置多个键值对

  1. 127.0.0.1:6379[1]> mset age 16 nickname xiaoyu
  2. OK
  3. 127.0.0.1:6379[1]> keys *
  4. 1) "age"
  5. 2) "name"
  6. 3) "nickname"

mget key [key……]

通过key获取多个键值对

  1. 127.0.0.1:6379[1]> mget name age nickname
  2. 1) "sanshisi"
  3. 2) "16"
  4. 3) "xiaoyu"

setex key second value

设置一个键值对,同时指定超时时间

  1. 127.0.0.1:6379[1]> setex timetest 10 hello
  2. OK
  3. 127.0.0.1:6379[1]> ttl timetest # 此处ttl是为了获取key的有效时间
  4. (integer) 5
  5. 127.0.0.1:6379[1]> ttl timetest
  6. (integer) -2
  7. 127.0.0.1:6379[1]> get timetest
  8. (nil)

setnx key value

如果键值对不存在,则增加键值对,如果存在,则没有变化

  1. 127.0.0.1:6379[1]> get name
  2. "sanshisi"
  3. 127.0.0.1:6379[1]> setnx name xiao
  4. (integer) 0
  5. 127.0.0.1:6379[1]> get name
  6. "sanshisi"
  7. 127.0.0.1:6379[1]> setnx nametwo xiao
  8. (integer) 1
  9. 127.0.0.1:6379[1]> get nametwo
  10. "xiao"

setrange key offset value

从key的值对应的位置开始替换字符串的值

  1. 127.0.0.1:6379[1]> setrange id 5 hello
  2. (integer) 10
  3. 127.0.0.1:6379[1]> get id
  4. "12345hello"

getrange key start end

获取[start, end]区间范围内的字符串,如果想要获取全部,可以end设置为-1

  1. 127.0.0.1:6379[1]> set id 1234567890
  2. OK
  3. 127.0.0.1:6379[1]> get id
  4. "1234567890"
  5. 127.0.0.1:6379[1]> getrange id 0 5
  6. "123456"
  7. 127.0.0.1:6379[1]> getrange id 0 -1
  8. "1234567890"

incr key

对key对应的值加一

  1. 127.0.0.1:6379[1]> set num 5
  2. OK
  3. 127.0.0.1:6379[1]> get num
  4. "5"
  5. 127.0.0.1:6379[1]> incr num
  6. (integer) 6
  7. 127.0.0.1:6379[1]> get num
  8. "6"
  9. =====可以直接创建
  10. 127.0.0.1:6379[1]> incr numincr
  11. (integer) 1
  12. 127.0.0.1:6379[1]> get numincr
  13. "1"

decr key

对key对应的值减一

  1. 127.0.0.1:6379[1]> decr num
  2. (integer) 5
  3. 127.0.0.1:6379[1]> get num
  4. "5"
  5. =====
  6. 127.0.0.1:6379[1]> decr numdecr
  7. (integer) -1
  8. 127.0.0.1:6379[1]> get numdecr
  9. "-1"

incrby key increment

对key对应的值加N

  1. 127.0.0.1:6379[1]> get num
  2. "5"
  3. 127.0.0.1:6379[1]> incrby num 5
  4. (integer) 10
  5. 127.0.0.1:6379[1]> get num
  6. "10"

decrby key increment

对key对应的值减N

  1. 127.0.0.1:6379[1]> decrby num 5
  2. (integer) 5
  3. 127.0.0.1:6379[1]> get num
  4. "5"

key操作命令

expire key second

给已经存在的键值对设置超时时间

  1. 127.0.0.1:6379[1]> expire id 5 # 此时没有id
  2. (integer) 0
  3. 127.0.0.1:6379[1]> set id 123456
  4. OK
  5. 127.0.0.1:6379[1]> expire id 8
  6. (integer) 1
  7. 127.0.0.1:6379[1]> ttl id
  8. (integer) 2
  9. 127.0.0.1:6379[1]> ttl id
  10. (integer) -2

ttl key

获取key的有效时间,如果为正数,则表示失效的秒数,如果是-1,则表示永久有效,如果是-2,则表示失效(也就是没有个键值对)

  1. 127.0.0.1:6379[1]> ttl name
  2. (integer) -1
  3. 127.0.0.1:6379[1]> ttl id
  4. (integer) -2

keys *

查看当前数据库下所有的key

  1. 127.0.0.1:6379[1]> keys *
  2. 1) "name"
  3. 2) "nametwo"
  4. 3) "nickname"
  5. 4) "num"
  6. 5) "numdecr"

exists key

判断某个key是否存在 (1存在 0不存在)

  1. 127.0.0.1:6379[1]> exists id
  2. (integer) 0
  3. 127.0.0.1:6379[1]> exists name
  4. (integer) 1

type key

判断key存储的数据的数据类型

  1. 127.0.0.1:6379[1]> type name
  2. string

del key

删除键值对

  1. 127.0.0.1:6379[1]> del name
  2. (integer) 1
  3. 127.0.0.1:6379[1]> get name
  4. (nil)

2.hash类型

  1. hset key field value # 保存对象的一个属性和属性的值
  2. hget key field # 获取对象的属性对应的属性值
  3. hmset key field value [field value] # 保存对象的多个属性和属性的值
  4. hmget key field [field ……] # 获取对象的属性对应的属性值
  5. hexists key field # 判断对象属性是否存在
  6. hdel key field [field] # 根据属性名称删除属性及值
  7. hkeys key # 获取所有的属性
  8. hvals key # 获取所有的值
  9. hgetall key # 获取所有属性和值
  10. hlen key # 获取包含属性的个数

hset key field value

保存对象的一个属性和属性的值

  1. 127.0.0.1:6379[1]> hset me name yu
  2. (integer) 1

hget key field

获取对象的属性对应的属性值

  1. 127.0.0.1:6379[1]> hget me name
  2. "yu"

hmset key field value [field value]

保存对象的多个属性和属性的值

  1. 127.0.0.1:6379[1]> hmset me age 20 nickname xiao
  2. OK

hmget key field [field ……]

获取对象的属性对应的属性值

  1. 127.0.0.1:6379[1]> hmget me name age nickname
  2. 1) "yu"
  3. 2) "20"
  4. 3) "xiao"

hexists key field

判断对象属性是否存在

  1. 127.0.0.1:6379[1]> hexists me id
  2. (integer) 0
  3. 127.0.0.1:6379[1]> hexists me name
  4. (integer) 1 # 存在

hdel key field [field]

根据属性名称删除属性及值

  1. 127.0.0.1:6379[1]> hdel me nickname
  2. (integer) 1

hkeys key

获取所有的属性

  1. 127.0.0.1:6379[1]> hdel me nickname
  2. (integer) 1

hvals key

获取所有的值

  1. 127.0.0.1:6379[1]> hvals me
  2. 1) "yu"
  3. 2) "20"

hgetall key

获取所有属性和值

  1. 127.0.0.1:6379[1]> hgetall me
  2. 1) "name"
  3. 2) "yu"
  4. 3) "age"
  5. 4) "20"

hlen key

获取包含属性的个数

  1. 127.0.0.1:6379[1]> hlen me
  2. (integer) 2

3.list类型

  1. lpush key value [value] # 列表头部增加多个数据
  2. rpush key value [value] # 列表尾部增加多个数据
  3. lrange key start end # 遍历列表
  4. linsert key before|after pivot value # 在一个元素前/后插入数据
  5. lpop key # 删除并且获取key对应的list第一个元素
  6. rpop key # 删除并且获取key对应的list最后一个元素
  7. llen key # 获取列表的长度
  8. lindex key index # 获取列表中索引对应的元素
  9. ltrim key start stop # 获取列表中[start, stop]组成的新的列表

lpush key value [value]

列表头部增加多个数据

  1. 127.0.0.1:6379[1]> lpush list 1 2 3
  2. (integer) 3
  3. 127.0.0.1:6379[1]> lrange list 0 -1
  4. 1) "3"
  5. 2) "2"
  6. 3) "1"

rpush key value [value]

列表尾部增加多个数据

  1. 127.0.0.1:6379[1]> lpush list 5 6 7
  2. (integer) 6
  3. 127.0.0.1:6379[1]> lrange list 0 -1
  4. 1) "7"
  5. 2) "6"
  6. 3) "5"
  7. 4) "3"
  8. 5) "2"
  9. 6) "1"

lrange key start end

遍历列表

  1. 127.0.0.1:6379[1]> lrange list 0 -1
  2. 1) "7"
  3. 2) "6"
  4. 3) "5"
  5. 4) "3"
  6. 5) "2"
  7. 6) "1"

linsert key before|after pivot value

在一个元素前/后插入数据

  1. 127.0.0.1:6379[1]> linsert list after 1 99
  2. (integer) 7
  3. 127.0.0.1:6379[1]> linsert list before 1 88
  4. (integer) 8
  5. 127.0.0.1:6379[1]> lrange list 0 -1
  6. 1) "7"
  7. 2) "6"
  8. 3) "5"
  9. 4) "3"
  10. 5) "2"
  11. 6) "88"
  12. 7) "1"
  13. 8) "99"

lpop key

删除并且获取key对应的list第一个元素

  1. 127.0.0.1:6379[1]> lpop list
  2. "7"

rpop key

删除并且获取key对应的list最后一个元素

  1. 127.0.0.1:6379[1]> rpop list
  2. "99"

llen key

获取列表的长度

  1. 127.0.0.1:6379[1]> lrange list 0 -1
  2. 1) "6"
  3. 2) "5"
  4. 3) "3"
  5. 4) "2"
  6. 5) "88"
  7. 6) "1"
  8. 127.0.0.1:6379[1]> llen list
  9. (integer) 6

lindex key index

获取列表中索引对应的元素

  1. 127.0.0.1:6379[1]> lrange list 0 -1
  2. 1) "6"
  3. 2) "5"
  4. 3) "3"
  5. 4) "2"
  6. 5) "88"
  7. 6) "1"
  8. 127.0.0.1:6379[1]> lindex list 2
  9. "3"

ltrim key start stop

获取列表中[start, stop]组成的新的列表

  1. 127.0.0.1:6379[1]> lrange list 0 -1
  2. 1) "6"
  3. 2) "5"
  4. 3) "3"
  5. 4) "2"
  6. 5) "88"
  7. 6) "1"
  8. 127.0.0.1:6379[1]> ltrim list 2 5
  9. OK
  10. 127.0.0.1:6379[1]> lrange list 0 -1
  11. 1) "3"
  12. 2) "2"
  13. 3) "88"
  14. 4) "1

4.set类型

  1. sadd key value [value] # 添加多个数据到key集合中
  2. smembers key # 获取key集合中所有的数据
  3. sismember key value # 判断value是否在key集合中存在
  4. scard key # 获取set的元素个数
  5. sinter key [key] # 获取多个集合 交集
  6. sdiff key [key] # 获取多个集合的差集
  7. sunion key [key] # 获取多个集合的并集

sadd key value [value]

添加多个数据到key集合中

  1. 127.0.0.1:6379[1]> sadd stu name
  2. (integer) 1
  3. 127.0.0.1:6379[1]> smembers stu
  4. 1) "name"
  5. 127.0.0.1:6379[1]> sadd stu age address
  6. (integer) 2
  7. 127.0.0.1:6379[1]> smembers stu
  8. 1) "address"
  9. 2) "age"
  10. 3) "name"

smembers key

获取key集合中所有的数据

  1. 127.0.0.1:6379[1]> smembers stu
  2. 1) "address"
  3. 2) "age"
  4. 3) "name"

sismember key value

判断value是否在key集合中存在

  1. 127.0.0.1:6379[1]> sismember stu age
  2. (integer) 1 # 在
  3. 127.0.0.1:6379[1]> sismember stu a
  4. (integer) 0

scard key

获取set的元素个数

  1. 127.0.0.1:6379[1]> smembers stu
  2. 1) "address"
  3. 2) "age"
  4. 3) "name"
  5. 127.0.0.1:6379[1]> scard stu
  6. (integer) 3

sinter key [key]

获取多个集合 交集

  1. 127.0.0.1:6379[1]> sadd tea name class score
  2. (integer) 3
  3. 127.0.0.1:6379[1]> smembers tea
  4. 1) "class"
  5. 2) "name"
  6. 3) "score"
  7. 127.0.0.1:6379[1]> smembers stu
  8. 1) "address"
  9. 2) "age"
  10. 3) "name"
  11. 127.0.0.1:6379[1]> sinter stu tea
  12. 1) "name"

sdiff key [key]

获取多个集合的差集

  1. 127.0.0.1:6379[1]> sdiff stu tea
  2. 1) "age"
  3. 2) "address"

sunion key [key]

获取多个集合的并集

  1. 127.0.0.1:6379[1]> sunion stu tea
  2. 1) "class"
  3. 2) "name"
  4. 3) "address"
  5. 4) "age"
  6. 5) "score"

5.zset

  1. zadd key score value [ score value] # 添加多个带权重的数据到key集合中
  2. zrange key start stop # 获取指定范围中所有的元素
  3. zcard key # 返回元素的个数
  4. zcount key min max # 返回score值在min和max之间的数据个数
  5. zscore key 元素 # 返回集合中元素的score值

zadd key score value [ score value]

添加多个带权重的数据到key集合中

  1. 127.0.0.1:6379[1]> zadd z1 10 zhao 5 zhang 4 liu 1 san # 10是权重
  2. (integer) 4

zrange key start stop

获取指定范围中所有的元素

  1. 127.0.0.1:6379[1]> zrange z1 0 -1
  2. 1) "san"
  3. 2) "liu"
  4. 3) "zhang"
  5. 4) "zhao"

zcard key

返回元素的个数

  1. 127.0.0.1:6379[1]> zcard z1
  2. (integer) 4

zcount key min max

返回score值在权重min和max之间的数据个数

  1. 127.0.0.1:6379[1]> zcount z1 4 5
  2. (integer) 2

zscore key 元素

返回集合中元素的score值

  1. 127.0.0.1:6379[1]> zscore z1 zhao
  2. "10"

6.key的补充命令

  1. keys pattern # 生产环境下,该命令请慎用 *多位, ? 0或者1位
  2. scann cursor # 一般在生产环境下,如果要查询所有的键,建议使用这个
  3. persist key # 将一个存着生命周期的键值对,持久化(永久有效)
  4. select index # 切换当前所有的数据库
  5. move key index # 移动键值对到其他数据库
  6. dbsize # 返回当前数据库保存的数据量
  7. info [section] # 该命令是查询数据库信息
  8. flushdb # 清空当前数据
  9. flushall # 情况数据库管理系统
  10. help # 帮助文档
  11. help @数据类型 # 查询某种数据类型下所有命令及相关说明
  12. help 命令 # 查询该命令的帮助文档
  13. help 指令 # 查询指令的帮助文档

keys pattern

查找键,生产环境下,该命令请慎用 *多位, ? 0或者1位

scann cursor

一般在生产环境下,如果要查询所有的键,建议使用这个

可以理解为limit,限制匹配到的指令条数,可以进行分页

  1. 127.0.0.1:6379[1]> keys *
  2. 1) "numincr"
  3. 2) "nickname"
  4. 3) "nametwo"
  5. 4) "me"
  6. 5) "sc"
  7. 6) "z1"
  8. 7) "tea"
  9. 8) "num"
  10. 9) "age"
  11. 10) "numdecr"
  12. 11) "list"
  13. 12) "stu"
  14. 127.0.0.1:6379[1]> scan 0 match * count 5 # 还是有点没搞懂
  15. 1) "10"
  16. 2) 1) "numincr"
  17. 2) "sc"
  18. 3) "list"
  19. 4) "stu"
  20. 5) "nickname"
  21. 6) "nametwo"
  22. 7) "me"

persist key

将一个存着生命周期的键值对,持久化(永久有效)

  1. 127.0.0.1:6379[1]> ttl aa
  2. (integer) -1
  3. 127.0.0.1:6379[1]> expire aa 30
  4. (integer) 1
  5. 127.0.0.1:6379[1]> ttl aa
  6. (integer) 27
  7. 127.0.0.1:6379[1]> ttl aa
  8. (integer) 24
  9. 127.0.0.1:6379[1]> persist aa
  10. (integer) 1
  11. 127.0.0.1:6379[1]> ttl aa
  12. (integer) -1

select index

切换当前所有的数据库

move key index

移动键值对到其他数据库

  1. 127.0.0.1:6379[1]> get aa
  2. "5"
  3. 127.0.0.1:6379[1]> select 2
  4. OK
  5. 127.0.0.1:6379[2]> keys *
  6. (empty list or set)
  7. 127.0.0.1:6379[2]> select 1
  8. OK
  9. 127.0.0.1:6379[1]> move aa 2
  10. (integer) 1
  11. 127.0.0.1:6379[1]> select 2
  12. OK
  13. 127.0.0.1:6379[2]> get aa
  14. "5"

dbsize

返回当前数据库保存的数据量

  1. 127.0.0.1:6379[1]> dbsize
  2. (integer) 12 # 12条数据

info [section]

该命令是查询数据库信息

  1. 127.0.0.1:6379[1]> info server
  2. # Server
  3. redis_version:3.2.100
  4. redis_git_sha1:00000000
  5. redis_git_dirty:0
  6. redis_build_id:dd26f1f93c5130ee
  7. redis_mode:standalone
  8. os:Windows
  9. arch_bits:64
  10. …………

flushdb

清空当前数据

  1. 127.0.0.1:6379[2]> dbsize
  2. (integer) 1
  3. 127.0.0.1:6379[2]> flushdb
  4. OK
  5. 127.0.0.1:6379[2]> dbsize
  6. (integer) 0

flushall

清空数据库管理系统

help

帮助文档

help @数据类型

查询某种数据类型下所有命令及相关说明

help 命令

查询该命令的帮助文档

  1. (integer) 0
  2. 127.0.0.1:6379[2]> help set
  3. SET key value [EX seconds] [PX milliseconds] [NX|XX]
  4. summary: Set the string value of a key
  5. since: 1.0.0
  6. group: string

help 指令

查询指令的帮助文档

三、

1.Redis订阅者和发布模式

简单的消息队列,实现进程间的消息传递

  1. 订阅频道:subscribe channel [channel……]
  2. 向对应的频道推送消息:publish channel message
  3. 取消订阅的频道:unsubscribe channel [channel……]

注意:虽然redis可以实现消息队列的作用,但是一般不建议使用redis去做消息队列

消息队列建议使用专门的消息中间件(ActiveMQ、kfaka……)

  1. 127.0.0.1:6379[6]> publish newnews 'nihoanihoa'
  2. (integer) 2
  3. ==========
  4. 127.0.0.1:6379[7]> subscribe newnews
  5. Reading messages... (press Ctrl-C to quit)
  6. 1) "subscribe"
  7. 2) "newnews"
  8. 3) (integer) 1
  9. 1) "message"
  10. 2) "newnews"
  11. 3) "nihoanihoa"
  12. ==========
  13. 127.0.0.1:6379[8]> subscribe newnews
  14. Reading messages... (press Ctrl-C to quit)
  15. 1) "subscribe"
  16. 2) "newnews"
  17. 3) (integer) 1
  18. 1) "message"
  19. 2) "newnews"
  20. 3) "nihoanihoa"

2.Redis的高可用(HA)

主从双备:一个主服务器,至少两个及以上从服务器

slaveof < masterip > < masterport >

从服务器需要启动:这个选项配置

slaveof 主服务器的ip地址或者域名 主服务器的端口

使用多进程模拟多台电脑的方式,实现下主从双备

  1. =====redis.windows.conf=====
  2. 257# and resynchronize with them.
  3. 258#
  4. 259# slaveof <masterip> <masterport>

Redis - 图1

Redis - 图2

如果主服务存在密码,则必须启用如下项:

masterauth 主服务器的密码

3.Redis事务

redis的命令都是原子性

redis的事务是不具备原子性的

开启事务

multi 命令

提交事务

exec 命令

回滚事务

discard 命令

watch基于乐观锁的监控

unwatch取消监控

Redis - 图3

4.Redis持久化

RDB(redis database)快照版

AOF(append only file)
通过日志的形式,将数据变化追加到日志文件中
默认关闭