Redis从入门到精通

admin 2023-10-22 746 阅读 0评论

Redis入门学习

今日目标

  • 了解什么是Redis
  • Redis的安装
  • 掌握Redis基础操作-掌握Redis的数据类型(重要)

Redis简介

在介绍什么是Redis的时候,先提出一些现象,共大家参考,然后再说什么是Redis

前些年网站的翻车现场

  • 12306总是崩溃的网站

  • 淘宝网站崩溃
  • 京东促销服务器崩溃

思考:为什么这些网站会奔溃?

从上面里个例子中,我们不难发现奔溃的一些原因:

  • 海量用户

  • 高并发

那么什么是出现网站奔溃的肯本原因呢?

  • 性能瓶颈: 磁盘IO性能低下
  • 扩展瓶颈: 数据关系复杂,扩展性能差,不方便大规模集群

思考:如果解决性能瓶颈?

使用非关系数据库(Nosql),非关系数据库有以下优点:

  • 内存存储:降低了磁盘IO次数
  • 不存储关系,只存储数据: 去除了数据间关系,关系越简单越好

Nosql介绍

NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。

作用:应对基于海量用户和海量数据前提下的数据处理问题

特征

  • 可扩容,可伸缩
  • 大数据量下高性能
  • 灵活的数据模型-高可用

常见 Nosql 数据库:

  • Redis
  • memcache
  • HBase
  • MongoDB

Redis介绍

什么是Redis

官网:https://redis.io

redis是一款非关系型数据库(NOSQL, not only sql),redis存储的数据是在内存中。

特点:可以快速读取到数据,因为存储的数据是在内存中的。

Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「**!的首字母缩写,也就是「远程字典服务」。

Redis特点

  • 基于内存存储,读写性能高

  • 适合存储热点数据(热点商品、资讯、新闻),一般数据一般变化频率比较低,或者是高并发请求数据

  • 企业应用广泛

Redis使用场景

  • 数据缓存
  • 消息队列
  • 注册中心
  • 发布订阅
  • 分布式锁

Redis下载和安装

Redis的下载可以分为windows和Linux版本

  • windows 版本下载地址:https://github.com/microsoftarchive/redis/releases
    • redis高级使用
    • 主要是redis4.x以上版本
  • Linux版本下载地址:http://download.redis.io/releases/
    • Redis入门使用
    • 主要以3.x版本为主

windows安装Redis

【步骤一】:下载Redis

  • 1.下载地址:
https://github.com/microsoftarchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.zip

  • 2.解压

注意:redis安装目录:

  • 不要有空格
  • 不要有中文

【步骤二】:windows启动Redis服务器

  • 打开cmd

  • 启动
redis-server.exe redis.windows.conf

【步骤三】:运行Redis客户端

set name lisi

get name

Linux安装Redis

【步骤一】:更新系统软件包和Redis编译需要的依赖

yum update -y
yum install gcc-c++ -y
yum install centos-release-scl -y
yum install devtoolset-9-gcc* scl enable devtoolset-9 bash -y
yum install -y gcc g++  make
yum install tcl -y

【步骤二】:下载和编译Redis

  • 下载Redis
curl -O -L http://download.redis.io/releases/redis-6.2.9.tar.gz

  • 解压Redis
tar -zxvf redis-6.2.9.tar.gz

  • 进入redis目录
cd redis-6.2.9

  • 编译
make 

【步骤三】:运行Redis的测试套件(可选)

注意:可能要花费几分钟

make test

【步骤四】:安装Redis到系统目录

make install

【步骤五】: 移动配置文件redis.conf

在redis目录下将redis.conf 复制一份到其src目录下

cp redis.conf src/

【步骤六】: 修改redis.conf文件

  • 将配置文件中的daemonize配置项改为yes,默认值为no
# 使用Ctrl+C 结束霸屏运行的服务器端,之后再进行编辑redis.conf
vim redis.conf

# 编辑文件 将 daemonize  no 修改为 daemonize  yes
daemonize  yes

  • redis的服务默认只是允许本机连接,其他机器默认情况是不被允许连接,如果允许其他机器也能连接linux的reids服务,那么需要修改bind 127.0.0.1  你自己的linux机器的ip地址
vim redis.conf

# 编辑内容将 "bind 127.0.0.1" 修改为 "bind 127.0.0.1 当前linux的ip"
bind 127.0.0.1 192.168.150.101

【步骤七】: 启动Redis

  • 进入src目录下,进行启动redis
cd src && ./redis-server redis.conf
  • 查看redis是否启动
netstat -ntlp | grep redis

效果:可以看到6379已经运行

【步骤八】: 启动客户端链接redis

新开一个finalshell

cd redis-6.2.9/src/
## 启动客户端
./redis-cli
set name zhangsan
get name

【步骤九】: 关闭防火墙

firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports

【步骤十】: windows系统中使用图形界面客户端远程访问linux的redis

  • 安装redis-desktop-manager

  • 安装好后,点击桌面图标启动

  • 链接

Redis基本操作

添加字符串信息

功能: 设置  key  value 数据
命令: set key value
示例: set name lisi

效果:

查询字符串信息

功能: 根据 key 查询对应的 value,如果不存在,返回空(nil)
命令: get key 
示例:get name

效果:

清除屏幕信息

功能:清除屏幕中的信息
命令: clear
示例:clear

效果:

帮助

功能:获取命令帮助文档,获取组中所有命令信息名称
命令: 
 - help 命令名称
 - help @组名
示例:help get

效果:

退出客户端

功能:退出客户端
命令: 
  - quit
  - exit
  - <ESC>
示例:help get

效果:

Redis数据类型

今日目标

掌握Redis的数据类型

昨天已经介绍了如何安装Redis,以及讲解了Redis的基本操作,那么现在我们就要具体学习Redis的数据类型了

Redis数据类型

Redis数据类型介绍

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string

  • 哈希 hash

  • 列表 list

  • 集合 set

  • 有序集合 sorted set / zset

Redis数据存储格式

  • redis本身就是一个Map,所有数据都是使用key:value格式进行存储
  • 数据类型是指存储数据类型,即value部分的数据类型,key用于都是字符串

string(字符串)类型

string类型数据特点:

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

string 类型数据的基本操作

  • 添加/修改数据
set key value
  • 获取数据
get key
  • 删除数据
del  key

示例:

set username springboot

get username

del username

get username

  • 添加/修改多个数据
mset key1 value1 key2 value2 …
  • 获取多个数据
mget key1 key2 …
  • 获取数据字符个数(字符串长度)
strlen key
  • 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value

示例:

#多数据添加
mset name zhangsan age 20
#获取多个数据
mget name age
#获取name对应value的长度
strlen name
#因为name存在,所以对数据进行追加 name 由zhangsan 变成zhangsansan
append name san

get name
# 因为username不存在所以创建新的key value
append username springboot

get username

string 类型数据的扩展操作

string 作为数值操作 incr/decrby使用场景

string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。

redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。

incr/decrby 格式:

  • 设置数值数据增加指定范围的值
# 对key值进行+1
incr key
# 对key值进行+increment
incrby key increment
  • 设置数值数据减少指定范围的值
# 对key值进行 -1
decr key
# 对key值进行 - increment
decrby key increment

使用场景:

记录我们有一个文章,记录该文章的点赞数,就可以使用incr/decr

set article:1043214:read 1

incr article:1043214:read

get article:1043214:read

decr article:1043214:read
 
get article:1043214:read

注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis数值上限范围,将报错

string 设置数据具有指定的生命周期

setex/psetex 格式

  • SETEX 命令设置一个带有过期时间的键(key),单位为秒
SETEX key seconds value
  • PSETEX 命令设置一个带有过期时间的键(key),单位为毫秒
PSETEX key milliseconds value

使用场景:

  • 电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消热门。

  • 新闻网站会出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性。

  • 总结:控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

setex mykey 60 "Hello Redis"

## 一分钟后获取mykey 结构为nil(空)
get mykey

效果:

psetex mykey 1000 "Hello Redis"

## 一秒后获取mykey 结构为nil(空)
get mykey

效果:

hash(哈希)类型

Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,

注意:hash里面包含的键值对个数有限制,限制42亿以内

hash类型数据特点:

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储

hash类型数据的基本操作

  • 添加/修改数据
hset key field value
  • 获取数据
hget key field 
hgetall key
  • 删除数据
hdel key field1 [field2]

示例:

## 添加数据
hset person name zhangsan
## 
hset person age 30
## 获取person的name
hget person name
## 获取person的age
hget person age
##获取整个person
hgetall person
## 删除
hdel person name age

hgetall person

效果:

  • 添加/修改多个数据
hmset key field1 value1 field2 value2 … 
  • 获取多个数据
hmget key field1 field2 … 
  • 获取哈希表中字段的数量
hlen key
  • 判断哈希表中是否存在指定的字段
hexists key field

示例:

hmset person name lisi age 40

hmget person name age
## 获取哈希表中 字段的数量
hlen person
## 判断person 是否存在name属性 存在返回1 不存在返回0
hexists person name

hexists person sex

效果:

hash类型数据扩展操作

  • 获取哈希表中所有的字段名或字段值
hkeys key 
hvals key
  • 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment

使用场景:

购物车数据,就可以使用redis进行存储

解决方案

  • 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息

  • 将商品编号作为field,购买数量作为value进行存储

  • 添加商品:追加全新的field与value

  • 浏览:遍历hash

  • 删除商品:删除field

  • 清空:删除key

代码示例:

hmset 001 order001 1 order002 2 order003 1

hgetall 001

hincrby 001 order001 1

hget 001 order001

hincrby 001 order002 -1

hget 001 order002

效果:

hash注意事项

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  • 每个hash 可以存储 232-1 个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  • hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈

list(列表)类型

Redis 列表是简单的字符串列表,按照插入顺序排序,

类似于java中的linkedList(双向链表),value的个数限制42亿个以内。list类型数据特点:

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

list 类型数据基本操作

  • 添加/修改数据
#Left,  将一个或多个值插入到列表头部(左部),
lpush key value1 [value2] ……
# rpush是从尾部插入
rpush key value1 [value2] ……
  • 获取数据
#获取列表指定范围内的元素
lrange key start stop 

lindex key index
#    获取列表长度
llen key 
  • 获取并移除数据
# lpop从左侧头部删除一个元素
lpop key 
# rpop从右侧头部删除一个元素
rpop key

示例:

# list左侧添加数据
lpush list zhangsan lisi wangwu
# 获取list 0 - 3数据
lrange list 0 3
# 获取list 0 到尾部数据
lrange list 0 -1
# 删除尾部数据
rpop list
# 获取长度
llen list
# 右侧添加数据
rpush list zhaoliu
# 获取倒数第二的数据
lindex list -2

效果:

list 类型数据扩展操作

  • 规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2]  timeout
brpoplpush source destination timeout
  • 移除指定数据
lrem key count value

【说明:】
- key 是要进行操作的列表的键名。

- count 是要删除的元素的数量,有以下几种情况:

   当 count > 0 时,从列表的头部开始,删除与 value 相等的元素,最多删除 count 个。
   当 count < 0 时,从列表的尾部开始,删除与 value 相等的元素,最多删除 count 绝对值的个数。
    当 count = 0 时,删除所有与 value 相等的元素。
- value 是要删除的具体元素的值。

使用场景:

微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息如果取消点赞,移除对应好友信息

解决方案

## 添加文章 点赞
rpush user001:article001 zhangsan wangwu
rpush user001:article001 lisi

##查看数据
lrange user001:article001 0 -1

## 从头部开始删除一个值为zhangsan的数据
lrem user001:article001 1 zhangsan
lrange user001:article001 0 -1

效果:

list 类型数据操作注意事项

  • list中保存的数据都是string类型的,数据总容量是有限的,最多232-1 个元素(4294967295)。
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

set(集合)类型

Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

set类型数据特点:

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

set类型数据的基本操作

  • 添加数据
#     向集合添加一个或多个成员
sadd key member1 [member2]
  • 获取全部数据
#  返回集合中的所有成员
smembers key 
  • 删除数据
#  移除集合中一个或多个成员
srem key member1 [member2]
  • 获取集合数据总量
scard key
  • 判断集合中是否包含指定数据
sismember key member

示例:

sadd set1 zhangsan lisi wangwu zhangsan

smembers set1

srem set1 lisi

smembers set1

scard set1

sismember set1 wangwu

sismember set1 zhaoliu

效果:

set 类型数据的扩展操作

  • 随机获取集合中指定数量的数据
srandmember key [count]
  • 随机获取集合中的某个数据并将该数据移出集合
spop key [count]

使用场景:

每位用户首次使用今日头条时会设置3项爱好的内容,但是后期为了增加用户的活跃度、兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?

业务分析:

- 系统分析出各个分类的最新或最热点信息条目并组织成set集合
- 随机挑选其中部分信息
- 配合用户关注信息分类中的热点信息组织成展示的全信息集合

解决方案:

sadd hostarticle article001 article002 article003 article004 article005
## 随机从hostarticle集合中获取3个数据
srandmember hostarticle 3

效果

  • 求两个集合的交、并、差集
sinter key1 [key2] 
sunion key1 [key2]
sdiff key1 [key2]
  • 求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2] 
sunionstore destination key1 [key2] 
sdiffstore destination key1 [key2] 
  • 将指定数据从原始集合中移动到目标集合中
smove source destination member  

set类型数据操作的注意事项

  • set 类型不允许数据重复,如果添加的数据在set 中已经存在,将只保留一份
  • set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

sorted set(有序集合)类型

Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score) 。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。 

sorted set类型数据特点:

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

sorted set类型数据的基本操作

  • 添加数据
zadd key score1 member1 [score2 member2]
  • 获取全部数据
# 正序
zrange key start stop [WITHSCORES]
# 倒叙
zrevrange key start stop [WITHSCORES]
  • 删除数据
zrem key member [member ...]
  • 按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]

zrevrangebyscore key max min [WITHSCORES]
  • 条件删除数据
zremrangebyrank key start stop 
zremrangebyscore key min max

注意:

  • min与max用于限定搜索查询的条件

  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引

  • offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

  • 获取集合数据总量

zcard key
zcount key min max
  • 集合交、并操作
zinterstore destination numkey skey [key ...]
zunionstore destination numkeys key [key ...]

效果

sorted set类型数据的扩展操作

  • 获取数据对应的索引(排名)
zrank key member
zrevrank key member
  • score值获取与修改
zscore key member
zincrby key increment member

使用场景:

  • 各类资源网站TOP10(电影,歌曲,文档,电商,游戏等)
  • 聊天室活跃度统计
  • 游戏好友亲密度分析

为所有参与排名的资源建立排序依据

示例:

## 文档热度排序 
zadd wordset 10 word001 30 word002 40 word003 90 word005 80 word006 70 word007
## 获取正序排序
zrank wordset word005
# 获取倒叙排序
zrevrank wordset word005

# 分数加
zincrby wordset 2 word005

效果:

sorted set类型数据操作的注意事项

  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
  • sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 746人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表