Redis
2022.1.14整理完毕
NoSQL指的是“not only SQL”,不仅仅是SQL
现在一般统指:一系列非 关系型数据库 MongoDB、redis、HBASE、hiving、es、solr……
这些数据库的特点是:不再使用表做完存储单元,一般都是使用Json这种灵活的类型存储数据
一、安装
1.windows安装
压缩版
直装版
注册为服务
2.Linux安装
3.启动
win压缩版或Linux版启动
redis-server # 开启服务
redis-cli # 进入数据库,没有密码
以下操作是为了让Redis开机自启
window注册为服务
redis-server --service-install g://mytools/redis/redis-window-server.conf
Linux
# 修改配置
# 将redis-server.conf 文件中的daemonize修改为yes
vim redis-server.conf
daemonize yes
二、配置文件
三、数据类型
Redis中存在5种最基本的数据类型
- String
- hash
- list
- set
- zset
Redis在后期版本扩展了很多新的特性
range queries
bitmaps
hyperloglogs
geospatial indexes
streams
1.String类型
配合 Ctrl+F 快速搜索定位自己想要的东西
set key value # 设置一个键值对
get key # 通过key获取值
mset key value [key value……] # 设置多个键值对
mget key [key……] # 通过key获取多个键值对
setex key second value # 设置一个键值对,同时指定超时时间
setnx key value # 如果键值对不存在,则增加键值对,如果存在,则没有变化
setrange key offset value # 从key的值对应的位置开始替换字符串的值
getrange key start end # 获取[start, end]区间范围内的字符串,如果想要获取全部,可以end设置为-1
incr key # 对key对应的值加一
decr key # 对key对应的值减一
incrby key increment # 对key对应的值加N
decrby key increment # 对key对应的值减N
=====key操作命令=====
expire key second # 给已经存在的键值对设置超时时间
ttl key # 获取key的有效时间,如果为正数,则表示失效的秒数,如果是-1,则表示永久有效,如果是-2,则表示失效(也就是没有个键值对)
keys * # 查看当前数据库下所有的key
exists key # 判断某个key是否存在
type key # 判断key存储的数据的数据类型
del key # 删除键值对
set key value
设置一个键值对
127.0.0.1:6379[1]> set name sanshisi
OK
127.0.0.1:6379[1]> keys *
1) "name"
get key
通过key获取值
127.0.0.1:6379[1]> get name
"sanshisi"
mset key value [key value……]
设置多个键值对
127.0.0.1:6379[1]> mset age 16 nickname xiaoyu
OK
127.0.0.1:6379[1]> keys *
1) "age"
2) "name"
3) "nickname"
mget key [key……]
通过key获取多个键值对
127.0.0.1:6379[1]> mget name age nickname
1) "sanshisi"
2) "16"
3) "xiaoyu"
setex key second value
设置一个键值对,同时指定超时时间
127.0.0.1:6379[1]> setex timetest 10 hello
OK
127.0.0.1:6379[1]> ttl timetest # 此处ttl是为了获取key的有效时间
(integer) 5
127.0.0.1:6379[1]> ttl timetest
(integer) -2
127.0.0.1:6379[1]> get timetest
(nil)
setnx key value
如果键值对不存在,则增加键值对,如果存在,则没有变化
127.0.0.1:6379[1]> get name
"sanshisi"
127.0.0.1:6379[1]> setnx name xiao
(integer) 0
127.0.0.1:6379[1]> get name
"sanshisi"
127.0.0.1:6379[1]> setnx nametwo xiao
(integer) 1
127.0.0.1:6379[1]> get nametwo
"xiao"
setrange key offset value
从key的值对应的位置开始替换字符串的值
127.0.0.1:6379[1]> setrange id 5 hello
(integer) 10
127.0.0.1:6379[1]> get id
"12345hello"
getrange key start end
获取[start, end]区间范围内的字符串,如果想要获取全部,可以end设置为-1
127.0.0.1:6379[1]> set id 1234567890
OK
127.0.0.1:6379[1]> get id
"1234567890"
127.0.0.1:6379[1]> getrange id 0 5
"123456"
127.0.0.1:6379[1]> getrange id 0 -1
"1234567890"
incr key
对key对应的值加一
127.0.0.1:6379[1]> set num 5
OK
127.0.0.1:6379[1]> get num
"5"
127.0.0.1:6379[1]> incr num
(integer) 6
127.0.0.1:6379[1]> get num
"6"
=====可以直接创建
127.0.0.1:6379[1]> incr numincr
(integer) 1
127.0.0.1:6379[1]> get numincr
"1"
decr key
对key对应的值减一
127.0.0.1:6379[1]> decr num
(integer) 5
127.0.0.1:6379[1]> get num
"5"
=====
127.0.0.1:6379[1]> decr numdecr
(integer) -1
127.0.0.1:6379[1]> get numdecr
"-1"
incrby key increment
对key对应的值加N
127.0.0.1:6379[1]> get num
"5"
127.0.0.1:6379[1]> incrby num 5
(integer) 10
127.0.0.1:6379[1]> get num
"10"
decrby key increment
对key对应的值减N
127.0.0.1:6379[1]> decrby num 5
(integer) 5
127.0.0.1:6379[1]> get num
"5"
key操作命令
expire key second
给已经存在的键值对设置超时时间
127.0.0.1:6379[1]> expire id 5 # 此时没有id
(integer) 0
127.0.0.1:6379[1]> set id 123456
OK
127.0.0.1:6379[1]> expire id 8
(integer) 1
127.0.0.1:6379[1]> ttl id
(integer) 2
127.0.0.1:6379[1]> ttl id
(integer) -2
ttl key
获取key的有效时间,如果为正数,则表示失效的秒数,如果是-1,则表示永久有效,如果是-2,则表示失效(也就是没有个键值对)
127.0.0.1:6379[1]> ttl name
(integer) -1
127.0.0.1:6379[1]> ttl id
(integer) -2
keys *
查看当前数据库下所有的key
127.0.0.1:6379[1]> keys *
1) "name"
2) "nametwo"
3) "nickname"
4) "num"
5) "numdecr"
exists key
判断某个key是否存在 (1存在 0不存在)
127.0.0.1:6379[1]> exists id
(integer) 0
127.0.0.1:6379[1]> exists name
(integer) 1
type key
判断key存储的数据的数据类型
127.0.0.1:6379[1]> type name
string
del key
删除键值对
127.0.0.1:6379[1]> del name
(integer) 1
127.0.0.1:6379[1]> get name
(nil)
2.hash类型
hset key field value # 保存对象的一个属性和属性的值
hget key field # 获取对象的属性对应的属性值
hmset key field value [field value] # 保存对象的多个属性和属性的值
hmget key field [field ……] # 获取对象的属性对应的属性值
hexists key field # 判断对象属性是否存在
hdel key field [field] # 根据属性名称删除属性及值
hkeys key # 获取所有的属性
hvals key # 获取所有的值
hgetall key # 获取所有属性和值
hlen key # 获取包含属性的个数
hset key field value
保存对象的一个属性和属性的值
127.0.0.1:6379[1]> hset me name yu
(integer) 1
hget key field
获取对象的属性对应的属性值
127.0.0.1:6379[1]> hget me name
"yu"
hmset key field value [field value]
保存对象的多个属性和属性的值
127.0.0.1:6379[1]> hmset me age 20 nickname xiao
OK
hmget key field [field ……]
获取对象的属性对应的属性值
127.0.0.1:6379[1]> hmget me name age nickname
1) "yu"
2) "20"
3) "xiao"
hexists key field
判断对象属性是否存在
127.0.0.1:6379[1]> hexists me id
(integer) 0
127.0.0.1:6379[1]> hexists me name
(integer) 1 # 存在
hdel key field [field]
根据属性名称删除属性及值
127.0.0.1:6379[1]> hdel me nickname
(integer) 1
hkeys key
获取所有的属性
127.0.0.1:6379[1]> hdel me nickname
(integer) 1
hvals key
获取所有的值
127.0.0.1:6379[1]> hvals me
1) "yu"
2) "20"
hgetall key
获取所有属性和值
127.0.0.1:6379[1]> hgetall me
1) "name"
2) "yu"
3) "age"
4) "20"
hlen key
获取包含属性的个数
127.0.0.1:6379[1]> hlen me
(integer) 2
3.list类型
lpush key value [value] # 列表头部增加多个数据
rpush key value [value] # 列表尾部增加多个数据
lrange key start end # 遍历列表
linsert key before|after pivot value # 在一个元素前/后插入数据
lpop key # 删除并且获取key对应的list第一个元素
rpop key # 删除并且获取key对应的list最后一个元素
llen key # 获取列表的长度
lindex key index # 获取列表中索引对应的元素
ltrim key start stop # 获取列表中[start, stop]组成的新的列表
lpush key value [value]
列表头部增加多个数据
127.0.0.1:6379[1]> lpush list 1 2 3
(integer) 3
127.0.0.1:6379[1]> lrange list 0 -1
1) "3"
2) "2"
3) "1"
rpush key value [value]
列表尾部增加多个数据
127.0.0.1:6379[1]> lpush list 5 6 7
(integer) 6
127.0.0.1:6379[1]> lrange list 0 -1
1) "7"
2) "6"
3) "5"
4) "3"
5) "2"
6) "1"
lrange key start end
遍历列表
127.0.0.1:6379[1]> lrange list 0 -1
1) "7"
2) "6"
3) "5"
4) "3"
5) "2"
6) "1"
linsert key before|after pivot value
在一个元素前/后插入数据
127.0.0.1:6379[1]> linsert list after 1 99
(integer) 7
127.0.0.1:6379[1]> linsert list before 1 88
(integer) 8
127.0.0.1:6379[1]> lrange list 0 -1
1) "7"
2) "6"
3) "5"
4) "3"
5) "2"
6) "88"
7) "1"
8) "99"
lpop key
删除并且获取key对应的list第一个元素
127.0.0.1:6379[1]> lpop list
"7"
rpop key
删除并且获取key对应的list最后一个元素
127.0.0.1:6379[1]> rpop list
"99"
llen key
获取列表的长度
127.0.0.1:6379[1]> lrange list 0 -1
1) "6"
2) "5"
3) "3"
4) "2"
5) "88"
6) "1"
127.0.0.1:6379[1]> llen list
(integer) 6
lindex key index
获取列表中索引对应的元素
127.0.0.1:6379[1]> lrange list 0 -1
1) "6"
2) "5"
3) "3"
4) "2"
5) "88"
6) "1"
127.0.0.1:6379[1]> lindex list 2
"3"
ltrim key start stop
获取列表中[start, stop]组成的新的列表
127.0.0.1:6379[1]> lrange list 0 -1
1) "6"
2) "5"
3) "3"
4) "2"
5) "88"
6) "1"
127.0.0.1:6379[1]> ltrim list 2 5
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "3"
2) "2"
3) "88"
4) "1
4.set类型
sadd key value [value] # 添加多个数据到key集合中
smembers key # 获取key集合中所有的数据
sismember key value # 判断value是否在key集合中存在
scard key # 获取set的元素个数
sinter key [key] # 获取多个集合 交集
sdiff key [key] # 获取多个集合的差集
sunion key [key] # 获取多个集合的并集
sadd key value [value]
添加多个数据到key集合中
127.0.0.1:6379[1]> sadd stu name
(integer) 1
127.0.0.1:6379[1]> smembers stu
1) "name"
127.0.0.1:6379[1]> sadd stu age address
(integer) 2
127.0.0.1:6379[1]> smembers stu
1) "address"
2) "age"
3) "name"
smembers key
获取key集合中所有的数据
127.0.0.1:6379[1]> smembers stu
1) "address"
2) "age"
3) "name"
sismember key value
判断value是否在key集合中存在
127.0.0.1:6379[1]> sismember stu age
(integer) 1 # 在
127.0.0.1:6379[1]> sismember stu a
(integer) 0
scard key
获取set的元素个数
127.0.0.1:6379[1]> smembers stu
1) "address"
2) "age"
3) "name"
127.0.0.1:6379[1]> scard stu
(integer) 3
sinter key [key]
获取多个集合 交集
127.0.0.1:6379[1]> sadd tea name class score
(integer) 3
127.0.0.1:6379[1]> smembers tea
1) "class"
2) "name"
3) "score"
127.0.0.1:6379[1]> smembers stu
1) "address"
2) "age"
3) "name"
127.0.0.1:6379[1]> sinter stu tea
1) "name"
sdiff key [key]
获取多个集合的差集
127.0.0.1:6379[1]> sdiff stu tea
1) "age"
2) "address"
sunion key [key]
获取多个集合的并集
127.0.0.1:6379[1]> sunion stu tea
1) "class"
2) "name"
3) "address"
4) "age"
5) "score"
5.zset
zadd key score value [ score value] # 添加多个带权重的数据到key集合中
zrange key start stop # 获取指定范围中所有的元素
zcard key # 返回元素的个数
zcount key min max # 返回score值在min和max之间的数据个数
zscore key 元素 # 返回集合中元素的score值
zadd key score value [ score value]
添加多个带权重的数据到key集合中
127.0.0.1:6379[1]> zadd z1 10 zhao 5 zhang 4 liu 1 san # 10是权重
(integer) 4
zrange key start stop
获取指定范围中所有的元素
127.0.0.1:6379[1]> zrange z1 0 -1
1) "san"
2) "liu"
3) "zhang"
4) "zhao"
zcard key
返回元素的个数
127.0.0.1:6379[1]> zcard z1
(integer) 4
zcount key min max
返回score值在权重min和max之间的数据个数
127.0.0.1:6379[1]> zcount z1 4 5
(integer) 2
zscore key 元素
返回集合中元素的score值
127.0.0.1:6379[1]> zscore z1 zhao
"10"
6.key的补充命令
keys pattern # 生产环境下,该命令请慎用 *多位, ? 0或者1位
scann cursor # 一般在生产环境下,如果要查询所有的键,建议使用这个
persist key # 将一个存着生命周期的键值对,持久化(永久有效)
select index # 切换当前所有的数据库
move key index # 移动键值对到其他数据库
dbsize # 返回当前数据库保存的数据量
info [section] # 该命令是查询数据库信息
flushdb # 清空当前数据
flushall # 情况数据库管理系统
help # 帮助文档
help @数据类型 # 查询某种数据类型下所有命令及相关说明
help 命令 # 查询该命令的帮助文档
help 指令 # 查询指令的帮助文档
keys pattern
查找键,生产环境下,该命令请慎用 *多位, ? 0或者1位
scann cursor
一般在生产环境下,如果要查询所有的键,建议使用这个
可以理解为limit,限制匹配到的指令条数,可以进行分页
127.0.0.1:6379[1]> keys *
1) "numincr"
2) "nickname"
3) "nametwo"
4) "me"
5) "sc"
6) "z1"
7) "tea"
8) "num"
9) "age"
10) "numdecr"
11) "list"
12) "stu"
127.0.0.1:6379[1]> scan 0 match * count 5 # 还是有点没搞懂
1) "10"
2) 1) "numincr"
2) "sc"
3) "list"
4) "stu"
5) "nickname"
6) "nametwo"
7) "me"
persist key
将一个存着生命周期的键值对,持久化(永久有效)
127.0.0.1:6379[1]> ttl aa
(integer) -1
127.0.0.1:6379[1]> expire aa 30
(integer) 1
127.0.0.1:6379[1]> ttl aa
(integer) 27
127.0.0.1:6379[1]> ttl aa
(integer) 24
127.0.0.1:6379[1]> persist aa
(integer) 1
127.0.0.1:6379[1]> ttl aa
(integer) -1
select index
切换当前所有的数据库
move key index
移动键值对到其他数据库
127.0.0.1:6379[1]> get aa
"5"
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> move aa 2
(integer) 1
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> get aa
"5"
dbsize
返回当前数据库保存的数据量
127.0.0.1:6379[1]> dbsize
(integer) 12 # 12条数据
info [section]
该命令是查询数据库信息
127.0.0.1:6379[1]> info server
# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows
arch_bits:64
…………
flushdb
清空当前数据
127.0.0.1:6379[2]> dbsize
(integer) 1
127.0.0.1:6379[2]> flushdb
OK
127.0.0.1:6379[2]> dbsize
(integer) 0
flushall
清空数据库管理系统
help
帮助文档
help @数据类型
查询某种数据类型下所有命令及相关说明
help 命令
查询该命令的帮助文档
(integer) 0
127.0.0.1:6379[2]> help set
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
help 指令
查询指令的帮助文档
三、
1.Redis订阅者和发布模式
简单的消息队列,实现进程间的消息传递
订阅频道:subscribe channel [channel……]
向对应的频道推送消息:publish channel message
取消订阅的频道:unsubscribe channel [channel……]
注意:虽然redis可以实现消息队列的作用,但是一般不建议使用redis去做消息队列
消息队列建议使用专门的消息中间件(ActiveMQ、kfaka……)
127.0.0.1:6379[6]> publish newnews 'nihoanihoa'
(integer) 2
==========
127.0.0.1:6379[7]> subscribe newnews
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "newnews"
3) (integer) 1
1) "message"
2) "newnews"
3) "nihoanihoa"
==========
127.0.0.1:6379[8]> subscribe newnews
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "newnews"
3) (integer) 1
1) "message"
2) "newnews"
3) "nihoanihoa"
2.Redis的高可用(HA)
主从双备:一个主服务器,至少两个及以上从服务器
slaveof < masterip > < masterport >
从服务器需要启动:这个选项配置
slaveof 主服务器的ip地址或者域名 主服务器的端口
使用多进程模拟多台电脑的方式,实现下主从双备
=====redis.windows.conf=====
257# and resynchronize with them.
258#
259# slaveof <masterip> <masterport>
如果主服务存在密码,则必须启用如下项:
masterauth 主服务器的密码
3.Redis事务
redis的命令都是原子性
redis的事务是不具备原子性的
开启事务
multi 命令
提交事务
exec 命令
回滚事务
discard 命令
watch
基于乐观锁的监控
unwatch
取消监控
4.Redis持久化
RDB(redis database)快照版
AOF(append only file)
通过日志的形式,将数据变化追加到日志文件中
默认关闭