1--Redis介绍 ; 安装
目录
一、nosql介绍
1.缓存的统称:nosql (非关系型数据库)
nodql特点
代表着不仅仅是sql
没有声明性查询语言
没有预定义的模式
键-值对存储,列存储,文档存储,图形数据库
最终一致性,而非ACID属性
# 缓存的统称是:NoSql
为什么使用nosql
随着互联网飞速发展,数据访问量和存储量高速扩大,传统的架构APP访问DAL层,DAL层在查询直接通过关系数据库(比如MySQL数据库)获取数据返回给用户已然出现了性能问题。为了解决这一问题,需要对数据库和数据表水平拆分和垂直拆分。
数据库拆分之后就会出现多个数据库,多个数据库又分别部署在不同的服务器,这时就需要对数据库进行集群,为了保证多台机器的缓存一致、可用性和分区容错性,分布式缓存(redis)的诞生正好解决了这个痛点。
# 分布式缓存为多个web服务器提供一个共享的高性能缓存服务。
2.企业中常用的缓存数据库比较
1、Memcached
# Memcached是一个自由开源的,高性能,分布式内存对象缓存系统
Memcached是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。
Memcached 是一种基于内存的 key-value 存储,用来存储小块的任意数据(字符串、对象)。这些数据可以 是数据库调用、API 调用或者是页面渲染的结果。
Memcached 简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。 它的 API 兼容大部分流行的开发语言。 本质上,它是一个简洁的 key-value存储系统
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高 可扩展性。
Memcached优缺点
# 优点:
高性能读写、单一数据类型、支持客户端分布式集群、一致性hash多和结构、多线程读写性能高。
# 缺点:
无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
2.Redis
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、 Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型
Redis优缺点
# 优点:
高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
# 缺点:
不支持多线程读写,相比Memcached会慢
3.Tair
Tair 是由淘宝网自主开发的 Key/Value 结构数据存储系统,在淘宝网有着大规模的应用。您在登录淘宝、查 看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和 Tair 交互
Tair 是一个 Key/Value 结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常 所说的缓存和持久化存储对应
Tair 除了普通 Key/Value 系统提供的功能,比如 get、put、delete 以及批量接口外,还有一些附加的实用功能, 使得其有更广的适用场景
Tair优缺点
# 优点:
高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存
# 缺点:
单机情况下,读写性能较其他两种产品较慢
4.总结
# Memcached:
分布式的多核多线程的缓存数据,遗憾的是Memcache只支持key=value这种数据类型,当访问大且缓存数据量多的时候,抖动比较大,更加适合于多用户并发访问次数(访问次数较少的应用场景)
# Redis:
单核单线程的缓存数据,,在单节点的情况下,更加适合少量用户,多次访问的应用场景,支持多种数据类型(字符串、列表、集合、有序集合)
二、企业级缓存中间件Redis
Redis 简介
Redis(Remote Dictionary Server ),即远程字典服务
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
1.软件特性
# 1、透明性:
分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时 系统,可让用户不必了解内部结构就可以使用。
# 2、扩展性:
分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的 整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升
# 3、可靠性:
分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替 它的工作,具有持续服务的特性。
# 4、高性能:
高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他 运行起来像蜗牛一样慢,那这个系统就是失败的
#5、redis是单线程的
2.Redis的常用功能
# 1、高速读写:
Redis 在运行时,将数据放在内存当中,利用内存的高性能的特性提高自己的服务性能
# 2、数据类型丰富:
Redis 具有丰富的数据类型,可以适用于各种场景
# 3、支持持久化:
因为 Redis 的数据是放在内存当中的,当 Redis 关机或者内存失效时,数据随即丢失,不可找 回,为了避免 Redis 重启时发生类似于雪崩事件,所以 Redis 官方增加了一个数据持久化的功能。
# 4、多种内存分配及回收策略:
Redis 可以通过 maxmemory 参数来限制最大可用内存,主要为了避免 Redis 内 存超过操作系统内存,从而导致服务器响应变慢甚至死机的情况。而回收策略主要是删除过期的 key 以及内 存达到 maxmemory
# 5、支持事物:
Redis 也支持类似于 MySQL 数据库那样的事务
# 6、消息队列、消息订阅:
Redis 的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现 一个高性能的优先队列。同时在更高层面上,Redis 还支持"发布/订阅"的消息模式,可以基于此构建一个聊 天系统
# 7、支持高可用:
Redis 支持两种高可用集群方式
扩展 --面试题
redi出现问题的两种现象:
#1.缓存雪崩:Redis缓存层由于某种原因宕机后,所有的请求会涌向数据库存储层,短时间内的高并发请求可能会导致存储层挂机,称之为“Redis雪崩”。
规避方案:1.服务器启动时,提前写入
2.规范key的命名,通过中间件拦截
3.对某些高频访问的key,设置合理的TTL或永不过期
#2.缓存击穿:在Redis获取某一key时, 由于key不存在, 而必须向数据库发起一次请求的行为, 称为“Redis击穿”。
规避方案:1.使用redis集群
2.限流
3.redis安装
1)、编译安装
#1.下载、解压
[root@redis01~]# wget https://download.redis.io/releases/redis-6.0.9.tar.gz
[root@redis01~]# tar -xf redis-6.0.9.tar.gz -C /usr/local
[root@redis01~]# cd /usr/local/redis-6.0.9/
#2.编译
在linux中编译软件需要安装gcc gcc-c++ make 等软件。
[root@redis01redis-6.0.9]# yum -y install centos-release-scl
[root@redis01redis-6.0.9]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@redis01redis-6.0.9]# scl enable devtoolset-9 bash
[root@redis01redis-6.0.9]# make -j #多核编译
#3.安装
[root@redis01redis-6.0.9]# make PREFIX=/usr/local/redis install #指定目录安装
#4.将配置文件移动到指定目录
[root@redis01 redis]# pwd
/usr/local/redis
[root@redis01redis]# mkdir conf
[root@redis01redis]# mv ../redis-6.0.9/redis.conf conf/
[root@redis01redis]# ll
总用量 0
drwxr-xr-x 2 root root 134 4月 30 20:35 bin
drwxr-xr-x 2 root root 24 4月 30 20:38 conf
[root@redis01redis]# ll conf/
总用量 84
-rw-rw-r-- 1 root root 84841 10月 27 2020 redis.conf
#5.启动
[root@redis01 redis]# ./bin/redis-server ./conf/redis.conf #指定配置文件启动
#6.验证启动(复制一个新窗口验证)
[root@redis01~]# cd /usr/local/redis
[root@redis01 redis]# ./bin/redis-cli
127.0.0.1:6379>
2)、容器安装
[root@docker redis]# vim redis.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: redis-deployment
spec:
selector:
matchLabels:
app: redis
deploy: redis
template:
metadata:
labels:
app: redis
deploy: redis
spec:
containers:
- name: redis
image: redis:6.0.9
---
kind: Service
apiVersion: v1
metadata:
name: redis-deployment-svc
spec:
ports:
- port: 6379
targetPort: 6379
name: redis
protocol: TCP
selector:
app: redis
deploy: redis
type: NodePort
[root@docker redis]# kubectl apply -f redis.yaml
[root@docker redis]# kubectl get svc
3)、使用systemctl管理redis *
#1.注册服务
cat > /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
#2.修改配置文件
[root@redis01conf]# vim /usr/local/redis/conf/redis.conf
daemonize yes #将no改为yes
#3.使用systemctl启动redis
[root@redis01 ~]# systemctl daemon-reload
[root@redis01conf]# systemctl enable --now redis
[root@docker redis]# systemctl status redis
4)、添加环境变量
#1.修改配置文件内容
[root@redis01conf]# vim /etc/profile.d/redis.sh
方式一:推荐
# Redis
export PATH=$PATH:/usr/local/redis/bin
方式二:
# Redis
export REDIS_HOME=/usr/local/redis
PATH=$PATH:$REDIS_HOME/bin
[root@redis01conf]# source /etc/profile #重新加载环境变量
#2.测试
[root@redis01~]# redis-cli
127.0.0.1:6379>
5)、设置密码
#1.修改配置文件
[root@redis01conf]# vim /usr/local/redis/conf/redis.conf
requirepass 123
#2.重启
[root@redis01~]# systemctl restart redis.service
#进入以后提示无权限 需要密码
[root@redis01~]# redis-cli
127.0.0.1:6379> set a b
(error) NOAUTH Authentication required.
#1.使用密码进入
[root@redis01~]# redis-cli -a 123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
#2.进入后使用密码
[root@redis01~]# redis-cli
127.0.0.1:6379> AUTH 123
OK
6)、解决中文乱码问题
[root@redis01~]# redis-cli
127.0.0.1:6379> set name 丹
OK
127.0.0.1:6379> get name
"\xe4\xb8\x80\xe5\xa4\x9c\xe6\x9a\xb4\xe5\xaf\x8c" #获取乱码
[root@redis01~]# redis-cli --raw
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> get name
丹
4、可以使用select进行切换数据库
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> dbsize #查看DB大小
(integer) 0
127.0.0.1:6379[3]> set name cdan
OK
127.0.0.1:6379[3]> dbsize #写了东西,大小有数值
(integer) 1
127.0.0.1:6379[3]> select 1 #切换到不同的数据库,只能拿自己的值
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> select 3
OK
127.0.0.1:6379[3]> get name
"cdan"
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> #默认是0号数据库