Redis6学习笔记(上)

为什么要学习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数据库

如何在Centos7上安装Redis6

安装Redis6网上有很多的教程 可以找适合的进行安装 这里是用yum进行安装的
在CentOS和Red Hat系统中,首先添加EPEL仓库,然后更新yum源:

sudo yum install epel-release
sudo yum update

然后安装Redis数据库:

sudo yum -y install redis

扫描二维码关注公众号,回复: 13714359 查看本文章

安装好后启动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。
  • 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
    在这里插入图片描述

常用命令


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元素
spop   key                      # 随机吐出集合的一个值,吐出就删除了
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<String,Object>

常用命令

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的那个。

一般设置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 城市名 # 返回地理位置的经度,纬度

image-20220113203307990

geodist key 地理位置 地理位置 [m|km|ft|mi] # 获取2个位置之间的直线距离

image-20220113203316730

单位:

m 表示单位为米[默认值]。

km 表示单位为千米。

mi 表示单位为英里。

ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位

georadius key 经度 纬度 距离 单位 # 找出经度纬度半径距离画圆之内的城市

猜你喜欢

转载自blog.csdn.net/qq_47431361/article/details/123240363