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修改为yesvim redis-server.confdaemonize yes
二、配置文件
三、数据类型
Redis中存在5种最基本的数据类型
- String
- hash
- list
- set
- zset
Redis在后期版本扩展了很多新的特性
range queriesbitmapshyperloglogsgeospatial indexesstreams
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设置为-1incr key # 对key对应的值加一decr key # 对key对应的值减一incrby key increment # 对key对应的值加Ndecrby key increment # 对key对应的值减N=====key操作命令=====expire key second # 给已经存在的键值对设置超时时间ttl key # 获取key的有效时间,如果为正数,则表示失效的秒数,如果是-1,则表示永久有效,如果是-2,则表示失效(也就是没有个键值对)keys * # 查看当前数据库下所有的keyexists key # 判断某个key是否存在type key # 判断key存储的数据的数据类型del key # 删除键值对
set key value
设置一个键值对
127.0.0.1:6379[1]> set name sanshisiOK127.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 xiaoyuOK127.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 nickname1) "sanshisi"2) "16"3) "xiaoyu"
setex key second value
设置一个键值对,同时指定超时时间
127.0.0.1:6379[1]> setex timetest 10 helloOK127.0.0.1:6379[1]> ttl timetest # 此处ttl是为了获取key的有效时间(integer) 5127.0.0.1:6379[1]> ttl timetest(integer) -2127.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) 0127.0.0.1:6379[1]> get name"sanshisi"127.0.0.1:6379[1]> setnx nametwo xiao(integer) 1127.0.0.1:6379[1]> get nametwo"xiao"
setrange key offset value
从key的值对应的位置开始替换字符串的值
127.0.0.1:6379[1]> setrange id 5 hello(integer) 10127.0.0.1:6379[1]> get id"12345hello"
getrange key start end
获取[start, end]区间范围内的字符串,如果想要获取全部,可以end设置为-1
127.0.0.1:6379[1]> set id 1234567890OK127.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 5OK127.0.0.1:6379[1]> get num"5"127.0.0.1:6379[1]> incr num(integer) 6127.0.0.1:6379[1]> get num"6"=====可以直接创建127.0.0.1:6379[1]> incr numincr(integer) 1127.0.0.1:6379[1]> get numincr"1"
decr key
对key对应的值减一
127.0.0.1:6379[1]> decr num(integer) 5127.0.0.1:6379[1]> get num"5"=====127.0.0.1:6379[1]> decr numdecr(integer) -1127.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) 10127.0.0.1:6379[1]> get num"10"
decrby key increment
对key对应的值减N
127.0.0.1:6379[1]> decrby num 5(integer) 5127.0.0.1:6379[1]> get num"5"
key操作命令
expire key second
给已经存在的键值对设置超时时间
127.0.0.1:6379[1]> expire id 5 # 此时没有id(integer) 0127.0.0.1:6379[1]> set id 123456OK127.0.0.1:6379[1]> expire id 8(integer) 1127.0.0.1:6379[1]> ttl id(integer) 2127.0.0.1:6379[1]> ttl id(integer) -2
ttl key
获取key的有效时间,如果为正数,则表示失效的秒数,如果是-1,则表示永久有效,如果是-2,则表示失效(也就是没有个键值对)
127.0.0.1:6379[1]> ttl name(integer) -1127.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) 0127.0.0.1:6379[1]> exists name(integer) 1
type key
判断key存储的数据的数据类型
127.0.0.1:6379[1]> type namestring
del key
删除键值对
127.0.0.1:6379[1]> del name(integer) 1127.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 xiaoOK
hmget key field [field ……]
获取对象的属性对应的属性值
127.0.0.1:6379[1]> hmget me name age nickname1) "yu"2) "20"3) "xiao"
hexists key field
判断对象属性是否存在
127.0.0.1:6379[1]> hexists me id(integer) 0127.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 me1) "yu"2) "20"
hgetall key
获取所有属性和值
127.0.0.1:6379[1]> hgetall me1) "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) 3127.0.0.1:6379[1]> lrange list 0 -11) "3"2) "2"3) "1"
rpush key value [value]
列表尾部增加多个数据
127.0.0.1:6379[1]> lpush list 5 6 7(integer) 6127.0.0.1:6379[1]> lrange list 0 -11) "7"2) "6"3) "5"4) "3"5) "2"6) "1"
lrange key start end
遍历列表
127.0.0.1:6379[1]> lrange list 0 -11) "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) 7127.0.0.1:6379[1]> linsert list before 1 88(integer) 8127.0.0.1:6379[1]> lrange list 0 -11) "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 -11) "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 -11) "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 -11) "6"2) "5"3) "3"4) "2"5) "88"6) "1"127.0.0.1:6379[1]> ltrim list 2 5OK127.0.0.1:6379[1]> lrange list 0 -11) "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) 1127.0.0.1:6379[1]> smembers stu1) "name"127.0.0.1:6379[1]> sadd stu age address(integer) 2127.0.0.1:6379[1]> smembers stu1) "address"2) "age"3) "name"
smembers key
获取key集合中所有的数据
127.0.0.1:6379[1]> smembers stu1) "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 stu1) "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) 3127.0.0.1:6379[1]> smembers tea1) "class"2) "name"3) "score"127.0.0.1:6379[1]> smembers stu1) "address"2) "age"3) "name"127.0.0.1:6379[1]> sinter stu tea1) "name"
sdiff key [key]
获取多个集合的差集
127.0.0.1:6379[1]> sdiff stu tea1) "age"2) "address"
sunion key [key]
获取多个集合的并集
127.0.0.1:6379[1]> sunion stu tea1) "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 -11) "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) -1127.0.0.1:6379[1]> expire aa 30(integer) 1127.0.0.1:6379[1]> ttl aa(integer) 27127.0.0.1:6379[1]> ttl aa(integer) 24127.0.0.1:6379[1]> persist aa(integer) 1127.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 2OK127.0.0.1:6379[2]> keys *(empty list or set)127.0.0.1:6379[2]> select 1OK127.0.0.1:6379[1]> move aa 2(integer) 1127.0.0.1:6379[1]> select 2OK127.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# Serverredis_version:3.2.100redis_git_sha1:00000000redis_git_dirty:0redis_build_id:dd26f1f93c5130eeredis_mode:standaloneos:Windowsarch_bits:64…………
flushdb
清空当前数据
127.0.0.1:6379[2]> dbsize(integer) 1127.0.0.1:6379[2]> flushdbOK127.0.0.1:6379[2]> dbsize(integer) 0
flushall
清空数据库管理系统
help
帮助文档
help @数据类型
查询某种数据类型下所有命令及相关说明
help 命令
查询该命令的帮助文档
(integer) 0127.0.0.1:6379[2]> help setSET key value [EX seconds] [PX milliseconds] [NX|XX]summary: Set the string value of a keysince: 1.0.0group: 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 newnewsReading messages... (press Ctrl-C to quit)1) "subscribe"2) "newnews"3) (integer) 11) "message"2) "newnews"3) "nihoanihoa"==========127.0.0.1:6379[8]> subscribe newnewsReading messages... (press Ctrl-C to quit)1) "subscribe"2) "newnews"3) (integer) 11) "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)
通过日志的形式,将数据变化追加到日志文件中
默认关闭
