文章目录
- 为什么要学习Redis
-
- 早期web1.0时期
- web2.0阶段
- Redis如何解决IO压力
- NoSQL数据库是什么
- 如何在Centos7上安装Redis6
- Redis的五大数据类型
-
- Redis键(key)
- Redis字符串(String)
-
- String的简介
- 常用命令
- Redis列表(List)
-
- List是什么?
- 常用命令
- Redis集合(Set)
-
- What is Set ?
- 常用命令
- Redis哈希(Hash)
-
- 简介
- 常用命令
- Redis有序集合(sorted set)
-
- 简介
- 常用指令
- Redis配置文件介绍
-
- Units单位
- INCLUDES包含
- 网络相关配置
-
- bind
- protected-mode
- Port
- tcp-backlog
- GENERAL通用
-
- daemonize
- pidfile
- loglevel
- databases 16
- LIMITS限制
-
- maxclients
- maxmemory
- maxmemory-policy
- maxmemory-samples
- Redis的发布和订阅
-
- 什么是发布和订阅
- 怎么实现发布和订阅
- Redis新数据类型
-
- BitMaps
-
- 简介
- 命令
- 举例
- 说明
- HyperLogLog
-
- 简介
- 命令
- Geospatial
-
- 简介
- 命令
为什么要学习Redis 缓解了io压力
早期web1.0时期 Web1.0的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题。
文章图片
web2.0阶段 随着Web2.0的时代的到来,用户访问量大幅度提升,同时产生了大量的用户数据。加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战。
文章图片
Redis如何解决IO压力
文章图片
NoSQL数据库是什么 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
- 不遵循SQL标准。
- 不支持ACID。
- 远超于SQL的性能。
Redis就是一种优秀的NoSQL数据库
在CentOS和Red Hat系统中,首先添加EPEL仓库,然后更新yum源:
sudo yum install epel-release然后安装Redis数据库:
sudo yum update
sudo yum -y install redis安装好后启动Redis服务即可:
sudo systemctl start redis这里同样可以使用redis-cli进入Redis命令行模式操作。
另外,为了可以使Redis能被远程连接,需要修改配置文件,路径为
/etc/redis.conf我们进入这个文件
vi /etc/redis.conf需要修改的地方:
首先,注释这一行:
#bind 127.0.0.1另外,推荐给Redis设置密码,取消注释这一行:
#requirepass foobaredfoobared即当前密码,可以自行修改为
requirepass 密码 设置密码很重要 如果你没有密码小心你的服务器被绿林好汉们用来挖矿
我们需要Redis在后台启动
我们需要把配置文件里面的
daemonize no改成yes然后重启Redis服务,使用的命令如下:
sudo systemctl restart redissystemctl start redis.service #启动redis服务器
systemctl stop redis.service #停止redis服务器
systemctl restart redis.service #重新启动redis服务器
systemctl status redis.service #获取redis服务器的运行状态
systemctl enable redis.service #开机启动redis服务器
systemctl disable redis.service #开机禁用redis服务器
Redis的五大数据类型 Redis键(key)
keys *# 查看当前库所有key(匹配:keys *1)
exists key# 判断某个key是否存在
type key# 查看你的key是什么类型
del key# 删除指定的key数据
unlink key# 根据value选择非阻塞删除
仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire key 10# 10秒钟:为给定的key设置过期时间
ttl key# 查看还有多少秒过期,-1表示永不过期,-2表示已过期
select# 命令切换数据库
dbsize# 查看当前数据库的key的数量
flushdb# 清空当前库
flushall# 通杀全部库
Redis字符串(String) String的简介
- String是Redis最基本的类型,一个key对应一个value。
- String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
- String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
- 当String的空间不够用的时候他会把String的空间给增加一倍 如果超过1M的话一次就增加1M
set key value# 如果不存在则创建一个key value,如果key已存在修改value的值
get key# 获取key的value值
strlen key# 获取key的长度
setnx key value# 创建一个key value,如果key已存在报错
incr key# 将key中储存的值+1,value必须为数字类型
decr key# 将key中储存的值-1,value必须为数字类型
incr key 步长# 将key中储存的值+步长,value必须为数字类型
decr key 步长# 将key中储存的值-步长,value必须为数字类型
mset key value key value# 创建多个key value
mget key value key value# 获取多个key的value值
msetnx key value key vale# 创建多个key value值,key不存在情况下
getrange key 3 4# 获取一个key的第三个字符到第四个字符,包前包后
setrange key 3 value# 在第三个字符后面插入一个value
setex key 过期时间 value# 规定一个key过期时间
getset key value# 查看一个key的value,但随后被替换为新的value
Redis列表(List) List是什么?
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
- 列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存当数据量比较多的时候才会改成quicklist。
- 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
文章图片
lpush key value1 value2 valu3# 在左边插入值,结果是 value3 value2 value1
rpush key value1 value2 valu3# 在右边插入值,结果是 value1 value2 value3
rpoplpush key1 key2# 从key1的右边吐出一个值,就像迭代器一样,每执行一次吐出一个值加到key2后面
lrange key value start stop# 取出这个key的start stop的值,0 -1是取出全部
lindex key index# 根据index取出value的值
llen key# 获取key的长度
linsert key before value newvalue# 在本来的value值后面插入一个值
lrem key n value# 从左边删除n个value
lset key index value# 将key下标为index的value替换为新的value
Redis集合(Set) What is Set ?
- Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
- 特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
sadd key value value# 创建一个新的集合
smembers key# 取出该集合所有的值
sismember key value# 判断该集合是否含有value值 有1 无0
scard key# 返回该集合的元素个数
srem key value1 value2# 删除集合中的value元素
spopkey# 随机吐出集合的一个值,吐出就删除了
srandmember key n# 随机从集合中取出n个值,不删除
smove key1 key2 value# 从key1中取出value添加到key2中
sinter key1 key2# 返回两个集合交集的元素,2个集合都有的值
sunion key1 key2# 返回两个集合并集的元素,2个集合全部的值
sdiff key1 key2# 返回两个集合差集的元素,key1中没有key2的值
Redis哈希(Hash) 简介
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map
hset key field value# 添加一个哈希集合,添加一个值 hset user id 1
hget key field# 获取key中field的value值
hmset key field value1 field value2 # 添加一个哈希结合,添加多个值 hmset user id 1 name zhangsan
hexists key field# 查看哈希表key中,field是否存在
hkeys key# 列出该hash集合所有的value
hincrby key field increment# 为哈希表key中field的value值加步长
hsetnx key field value# 在哈希表key中添加一列firld-value
Redis有序集合(sorted set) 简介
- Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
- 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
zadd key 评分 value 评分 value# 创建一个有序集合,根据评分选择先后
zrange key start end withscores# 返回下标为几到几的,withscores显示评分
zrangebyscore key 评分~评分 [withscores]# 返回评分几到几,withscores显示评分
zrevrangebyscore key 评分~评分 [withscores]# 返回key中频分几到几的值,withscores显示评分,从大到小排列
zincrby key 步长 value# 为key中的value评分加步长
zrem key value# 删除指定的值
zcount key min max# 评分几到几的个数
zrank key value# 返回该值在集合中的排名,从0开始
Redis配置文件介绍 Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit
大小写不敏感
文章图片
INCLUDES包含 类似jsp中的include,多实例的情况可以把公用的配置文件提取出来
文章图片
网络相关配置 bind
默认情况bind=127.0.0.1只能接受本机的访问请求
不写的情况下,无限制接受任何ip地址的访问
生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉
如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应
文章图片
protected-mode
将本机访问保护模式设置no
文章图片
Port
端口号,默认 6379
文章图片
tcp-backlog
设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。
文章图片
GENERAL通用 daemonize
是否为后台进程,设置为yes
守护进程,后台启动
文章图片
pidfile
存放pid文件的位置,每个实例会产生一个不同的pid文件
文章图片
loglevel
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
四个级别根据使用阶段来选择,生产环境选择notice 或者warning
文章图片
databases 16
设定库的数量 默认16,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
文章图片
LIMITS限制 maxclients
设置redis同时可以与多少个客户端进行连接
默认情况下为10000个客户端。
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。
文章图片
maxmemory
建议必须设置,否则,将内存占满,造成服务器宕机
设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。
文章图片
maxmemory-policy
volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
allkeys-lru:在所有集合key中,使用LRU算法移除key
volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
allkeys-random:在所有集合key中,移除随机的key
volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
noeviction:不进行移除。针对写操作,只是返回错误信息
文章图片
maxmemory-samples
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
【微服务学习|Redis6学习笔记(上)】一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。
文章图片
Redis的发布和订阅 什么是发布和订阅
文章图片
Redis 客户端可以订阅任意数量的
怎么实现发布和订阅 1、 打开一个客户端订阅channel1
SUBSCRIBE channel1
文章图片
2、打开另一个客户端,给channel1发布消息hello
publish channel1 hello
文章图片
返回的1是订阅者数量
3、打开第一个客户端可以看到发送的消息
注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息
Redis新数据类型 BitMaps 简介
- Bitmaps本身不是一种数据类型,实际上它就是把字符串(key-value),但是它可以对字符串的位进行操作
- Bitmaps是一个位单位的数组,数组的每个单元只能存储0和1,数组下标bitmaps中叫做偏移量
文章图片
命令
Setbit key offset value # 创建一个Bitmaps中某个偏移量的值 0 或 1举例
每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id。
设置键的第offset个位的值(从0算起)
假设现在有20个用户,userid=1 6 11 15 19的用户对网站进行了访问
那么当前Bitmaps初始化结果如图
文章图片
文章图片
Getbit key offset # 获取bitmaps中的某个偏移量获取id为8的用户是否在某天访问过,返回0说明没有访问过:
文章图片
Bitcount key # 获取这个key中为1的数量演示案例:
Bitcount key start end # 计算start8到end8中1的个数
Bitop and(or/not/xor) destkey key # bitop是一个复合操作, 它可以做多个Bitmaps的and(交集)、 or、(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。
2020-11-04 日访问网站的userid=1,2,5,9。
setbit unique:users:20201104 1 1
setbit unique:users:20201104 2 1
setbit unique:users:20201104 5 1
setbit unique:users:20201104 9 1
2020-11-03 日访问网站的userid=0,1,4,9。
setbit unique:users:20201103 0 1
setbit unique:users:20201103 1 1
setbit unique:users:20201103 4 1
setbit unique:users:20201103 9 1
计算出两天都访问过网站的用户数量
bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
Bitop 并集 暂时存储的集合 20201103号 20201104号
说明
用户多的时候用bitmaps 用户少的时候使用key-value
HyperLogLog 简介
用于记录不重复的数据,比如说在这个类型中的一个key中存储了java,再存java就失败了
命令
pfadd key 值1 值2 # 创建一个set差不多的数据类型
文章图片
pfcount key [key…] # 统计1个或多个key中不重复的数据
文章图片
pfmerge key3 key2 key1 # 将key1和key2的值合并到key3中Geospatial 简介
文章图片
对地理位置的操作
命令
geoadd key 经度 纬度 名称 # 添加一个或多个地理位置坐标
文章图片
两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。
geopos key 城市名 # 返回地理位置的经度,纬度
文章图片
geodist key 地理位置 地理位置 [m|km|ft|mi] # 获取2个位置之间的直线距离
文章图片
单位:
m 表示单位为米[默认值]。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位
georadius key 经度 纬度 距离 单位 # 找出经度纬度半径距离画圆之内的城市
推荐阅读
- 微服务学习|Nginx学习笔记
- 微服务学习|Docker学习笔记
- 程序人生|给3月准备跳槽的后端提个醒,千万别当愣头青
- 微服务学习|Redis6学习笔记(下)
- java人生|985 毕业的那个大龄码农被裁了
- 数据库|【分布式系列01期】常见的分布式ID生成方案浅析及大厂方案调研
- 笔记|咖啡汪对敖丙老哥Java后端面试心得体会————阿里一面
- Redis 主从复制的原理及演进
- Redis笔记|哨兵模式笔记