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值将被反复覆盖,保留最后一次修改的结果