微服务学习|Redis6学习笔记(上)


文章目录

  • 为什么要学习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的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题。
微服务学习|Redis6学习笔记(上)
文章图片

web2.0阶段 随着Web2.0的时代的到来,用户访问量大幅度提升,同时产生了大量的用户数据。加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战。
微服务学习|Redis6学习笔记(上)
文章图片

Redis如何解决IO压力 微服务学习|Redis6学习笔记(上)
文章图片

NoSQL数据库是什么 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
  • 不遵循SQL标准。
  • 不支持ACID。
  • 远超于SQL的性能。
    Redis就是一种优秀的NoSQL数据库
如何在Centos7上安装Redis6 安装Redis6网上有很多的教程 可以找适合的进行安装 这里是用yum进行安装的
在CentOS和Red Hat系统中,首先添加EPEL仓库,然后更新yum源:
sudo yum install epel-release
sudo yum update
然后安装Redis数据库:
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 foobared
foobared即当前密码,可以自行修改为
requirepass 密码 设置密码很重要 如果你没有密码小心你的服务器被绿林好汉们用来挖矿
我们需要Redis在后台启动
我们需要把配置文件里面的
daemonize no改成yes
然后重启Redis服务,使用的命令如下:
sudo systemctl restart redis
systemctl 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。
  • 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
    微服务学习|Redis6学习笔记(上)
    文章图片
常用命令
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
大小写不敏感
微服务学习|Redis6学习笔记(上)
文章图片

INCLUDES包含 类似jsp中的include,多实例的情况可以把公用的配置文件提取出来
微服务学习|Redis6学习笔记(上)
文章图片

网络相关配置 bind
默认情况bind=127.0.0.1只能接受本机的访问请求
不写的情况下,无限制接受任何ip地址的访问
生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉
如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应
微服务学习|Redis6学习笔记(上)
文章图片

protected-mode
将本机访问保护模式设置no
微服务学习|Redis6学习笔记(上)
文章图片

Port
端口号,默认 6379
微服务学习|Redis6学习笔记(上)
文章图片

tcp-backlog
设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。
微服务学习|Redis6学习笔记(上)
文章图片

GENERAL通用 daemonize
是否为后台进程,设置为yes
守护进程,后台启动
微服务学习|Redis6学习笔记(上)
文章图片

pidfile
存放pid文件的位置,每个实例会产生一个不同的pid文件
微服务学习|Redis6学习笔记(上)
文章图片

loglevel
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
四个级别根据使用阶段来选择,生产环境选择notice 或者warning
微服务学习|Redis6学习笔记(上)
文章图片

databases 16
设定库的数量 默认16,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
微服务学习|Redis6学习笔记(上)
文章图片

LIMITS限制 maxclients
设置redis同时可以与多少个客户端进行连接
默认情况下为10000个客户端。
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。
微服务学习|Redis6学习笔记(上)
文章图片

maxmemory
建议必须设置,否则,将内存占满,造成服务器宕机
设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。
微服务学习|Redis6学习笔记(上)
文章图片

maxmemory-policy
volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
allkeys-lru:在所有集合key中,使用LRU算法移除key
volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
allkeys-random:在所有集合key中,移除随机的key
volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
noeviction:不进行移除。针对写操作,只是返回错误信息
微服务学习|Redis6学习笔记(上)
文章图片

maxmemory-samples
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
【微服务学习|Redis6学习笔记(上)】一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。
微服务学习|Redis6学习笔记(上)
文章图片

Redis的发布和订阅 什么是发布和订阅 微服务学习|Redis6学习笔记(上)
文章图片

Redis 客户端可以订阅任意数量的
怎么实现发布和订阅 1、 打开一个客户端订阅channel1
SUBSCRIBE channel1
微服务学习|Redis6学习笔记(上)
文章图片

2、打开另一个客户端,给channel1发布消息hello
publish channel1 hello
微服务学习|Redis6学习笔记(上)
文章图片

返回的1是订阅者数量
3、打开第一个客户端可以看到发送的消息
注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息
Redis新数据类型 BitMaps 简介
  • Bitmaps本身不是一种数据类型,实际上它就是把字符串(key-value),但是它可以对字符串的位进行操作
  • Bitmaps是一个位单位的数组,数组的每个单元只能存储0和1,数组下标bitmaps中叫做偏移量
微服务学习|Redis6学习笔记(上)
文章图片

命令
Setbit key offset value # 创建一个Bitmaps中某个偏移量的值 0 或 1
举例
每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id。
设置键的第offset个位的值(从0算起)
假设现在有20个用户,userid=1 6 11 15 19的用户对网站进行了访问
那么当前Bitmaps初始化结果如图
微服务学习|Redis6学习笔记(上)
文章图片

微服务学习|Redis6学习笔记(上)
文章图片

Getbit key offset # 获取bitmaps中的某个偏移量
获取id为8的用户是否在某天访问过,返回0说明没有访问过:
微服务学习|Redis6学习笔记(上)
文章图片

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差不多的数据类型
微服务学习|Redis6学习笔记(上)
文章图片

pfcount key [key…] # 统计1个或多个key中不重复的数据
微服务学习|Redis6学习笔记(上)
文章图片

pfmerge key3 key2 key1 # 将key1和key2的值合并到key3中
微服务学习|Redis6学习笔记(上)
文章图片

Geospatial 简介
对地理位置的操作
命令
geoadd key 经度 纬度 名称 # 添加一个或多个地理位置坐标
微服务学习|Redis6学习笔记(上)
文章图片

两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。
geopos key 城市名 # 返回地理位置的经度,纬度
微服务学习|Redis6学习笔记(上)
文章图片

geodist key 地理位置 地理位置 [m|km|ft|mi] # 获取2个位置之间的直线距离
微服务学习|Redis6学习笔记(上)
文章图片

单位:
m 表示单位为米[默认值]。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位
georadius key 经度 纬度 距离 单位 # 找出经度纬度半径距离画圆之内的城市

    推荐阅读