Redis的基础使用
redis的安装
windows不是官方版本,是别人封装过了的,本质还是linux
- 安装依赖
- 进入指定文件夹,该文件夹用于存放相关文件
- 引入redis文件
- 解压文件
redis的启动
前台启动
在任意位置输入redis-server
即可前台启动,但会阻塞整个会话窗口,不建议这种启动方式
后台启动
- 保险起见,备份一份配置文件
cp redis.conf redis.conf.bck
- 修改相关配置
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 密码,设置后访问Redis必须输入密码
requirepass 123456
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
- 进入安装目录
cd /usr/local/src/redis-6.2.6
- 启动
redis-server redis.conf
设置开机自启动
- 首先,新建一个系统服务文件:
vi /etc/systemd/system/redis.service
将下面内容粘贴到下面去
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
- 重载系统服务
systemctl daemon-reload
,让系统获取到该文档 - 启动redis
systemctl start redis
- 关闭redis:
shutdown
- 设置开机自启
systemctl enable redis
redis的关闭
redis-cli -p 6379 shutdown
redis的连接
- 输入
redis-cli -h 192.168.146.128 -p 6379 -a 123456
,没有密码则取消a
- 上述情况有时候没输密码能进有时候进不了报NOAUTH Authentication required.输入auth "yourpassword"即可进入
密码设置
config set requirepass 123456
Java操作Redis
Spring Data Redis
基础知识
- 键值对创建后有效期为永久有效
- redis的键值允许层级结构来存储,以此来实现类似于不同表的同一id功能,通过:实现分层
基本数据类型
字符串
字符串又分为三种,普通字符串,int、float,但是int和float存储形式是按二进制存储的,这样能存更多的数据,字符串,单个键值对最大存储为512mb
- SET:添加或者修改已经存在的一个String类型的键值对(会覆盖)
- GET:根据key获取String类型的value
- MSET:批量添加多个String类型的键值对
- MGET:根据多个key获取多个String类型的value
- INCR:让一个整型的key自增1
- INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
- INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行(不会覆盖原有的value)
- SETEX:添加一个String类型的键值对,并且指定有效期
集合(Set)
特点
常见命令
- SADD key member ... :向set中添加一个或多个元素
- SREM key member ... : 移除set中的指定元素
- SCARD key: 返回set中元素的个数
- SISMEMBER key member:判断一个元素是否存在于set中
- SMEMBERS key:获取set中的所有元素
- SINTER key1 key2 ... :求key1与key2的交集
- SDIFF key1 key2...:求key1与key2的差集
- SUNION key1 key2...:求key1和key2的并集
有序集合(Sorted Set)
SortedSet具备下列特性:
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令有:
- ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
- ZREM key member:删除sorted set中的一个指定元素
- ZSCORE key member : 获取sorted set中的指定元素的score值
- ZRANK key member:获取sorted set 中的指定元素的排名
- ZCARD key:获取sorted set中的元素个数
- ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
- ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
- ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max whitscores limit offset count:按照score排序后,获取指定score范围内的元素,可以用滚动查询,offset为从最大值开始的偏移量,count为插叙的数据条数
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:
- 升序获取sorted set 中的指定元素的排名:ZRANK key member
- 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber
列表(list)
- LPUSH key element ... :向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
- RPUSH key element ... :向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key star end:返回一段角标范围内的所有元素
- BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
哈希(Hash)
哈希类型存储对象是每个字段分别存储,可对一个对象的单个字段进行修改
- HSET key field value:添加或者修改hash类型key的field的值
- HGET key field:获取一个hash类型key的field的值
- HMSET:批量添加多个hash类型key的field的值
- HMGET:批量获取多个hash类型key的field的值
- HGETALL:获取一个hash类型的key中的所有的field和value
- HKEYS:获取一个hash类型的key中的所有的field
- HINCRBY:让一个hash类型key的字段值自增并指定步长
- HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
特殊类型
位图(Bitmap)
作用
多用于签到统计
- SETBIT:向指定位置(offset)存入一个0或1
- GETBIT:获取指定位置(offset)的bit值
- BITCOUNT:统计BitMap中值为1的bit位的数量
- BITFIELD:操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值,查询时offset表示从哪开始,type表示从开始点往后读取多少位,还能指定返回结果有无符号,返回结果以十进制返回
- BITFIELD_RO:获取BitMap中bit数组,并以十进制形式返回
- BITOP:将多个BitMap的结果做位运算(与、或、异或)
- BITPOS:查找bit数组中指定范围内第一个0或1出现的位置
HyperLogLog
Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb,内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。不过对于UV统计来说,这完全可以忽略。
使用场景
用于UV统计(UV统计统计用户数量,PV统计页面访问次数)
- PFADD:添加进去
- PFCOUNT:统计数量,重复值不会多次统计
- PFMERGE KEY1 KEY2:将key2的数据添加进key1
地理空间(Geospatial)
多用于位置距离计算,范围寻找
- GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
- GEODIST:计算指定的两个点之间的距离并返回
- GEOHASH:将指定member的坐标转为hash字符串形式并返回
- GEOPOS:返回指定member的坐标
- GEORADIUS:指定圆心、半径,找到该圆内包含的所有membeer,并按照与圆心之间的距离排序后返回。6.2以后已废弃
- GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能
- GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。6.2.新功能
流(Stream)
是一种仅追加的数据结构,不允许修改和删除
XADD key [NOMKSTREAM] [<MAXLEN | MINID> [= | ~] threshold [LIMIT count]] <* | id> field value [field value ...]
- key:队列名
- NOMKSTREAM:不存在时是否自动创建队列,默认开启
- 最大消息数量
- 消息的唯一ID,*代表由redis自动生成,格式为时间戳-递增数字
- 消息,为多个键值对
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id...]
- COUNT count:每次读取消息的最大数量
- BLOCK milliseconds:没有消息时是否阻塞,阻塞时长,0为永久阻塞
- STREAMS key [key ...]:从哪些队列读取消息
- id [id...]:起始ID,只返回大于该ID的消息,0代表从第一个消息开始,$代表从最新的消息开始
使用过程中问题
监听时,如果处理消息过程中,一次性来了多条数据,将会出现消息漏读,通过消费者组解决
消费者组
- 消息分流:将队列中的消息分发给组中不同消费者
- 消息标识:消费者组会维护一个标识,该标识记录最后一个被处理的消息,宕机重启后,还是会从该标识之后读取消息
- 消息确认:消费者获取消息后,消息处于一个pending状态,存入一个pending-list,处理完后通过XACK来确认消息,标记为已处理后,才会将消息从pending-list移除
使用
XGROUP CREATE key group <id | $> [MKSTREAM] [ENTRIESREAD entries-read]
- key:队列名称
- group:组名称
- id:从哪开始监听
- MKSTREAM:自动创建队列
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]
- group:消费者组名称
- consumer:消费者名称
- count:本次查询的最大数量
- BLOCK milliseconds:没有消息时的阻塞时长
- NOACK:无需手动ACK,获取消息后自动确认
XACK key group id [id ...]
- STREAMS key [key ...]:指定队列名称
- id [id ...]:获取消息的起始ID
- ">":从下一个未消费的消息开始
- 其它:根据指定id从pending-list中获取已消费但未确认的消息息,例如0,是从pending-list中的第一个消息开始
XGROUP DESTORY key groupName
:删除指定的消费者组
Redis键值对与常规的键值对比
- redis的键值可以存对象类型,而不仅仅只有基本数据类型,例如list数组、哈希表
- redis是非关系数据库(NOSQL),非关系数据库有多种存储,常见的有键值存储,文档存储,列存储、图存储、对象存储
Redis相关知识
redis中命令
- 选择第几个数据库:select 数字
- 连接redis:
redis-cli -h 192.168.146.128 -p 6379 -a密码
- -p:指定的端口,如果不指定,则默认6379端口
- -h:指定的主机地址
- -a:指定的密码
- keys:查询匹配的key,例如:keys *(查询所有的key)、key n*(查询n开头的所有key),
- del:删除指定的键,可批量删除,返回值为成功删除的键值对数量,例如:del k1(删除键为k1的数据对),del k1 k2 k3 k4(批量删除,若有没有的键不影响,)
- exists:判断一个键是否存在,存在返回1,不存在返回0,例如:exists k1
- expire:为key值设置一个有效期,到期时该key值会自动删除,默认值为秒
- ttl:查询一个key值的有效期,-1为永久有效