redis
redis简介
redis -- 缓存数据库
软件说明:
Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
Redis采用内存(In-Memory)数据集(DataSet) 。
支持多种数据类型。
运行于大多数POSIX系统,如Linux、*BSD、OS X等。
作者: Salvatore Sanfilippo
#### 缓存数据库有哪些
redis ETCD MongoDB Mencache Tair 。。。
redis的软件特性
1)透明性:分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统,可让用户不必了解内部结构就可以使用。
2)扩展性:分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升。
redis的集群
哨兵模式sentinel
cluster (克拉斯特儿)
3)可靠性:分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替它的工作,具有持续服务的特性。
4)高性能:高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他运行起来像蜗牛一样慢,那这个系统就是失败的。
redis软件获取和帮助
官方网站:https://redis.io/
下载地址:https://download.redis.io/releases/
帮助网站:https://redis.io/docs/latest/
redis的数据类型
string # 字符串类型
list # 列表类型
set # 集合类型
sorted set # 有序集合类型
hash # 哈希类型
string字符串
## String(字符串)
定义:String是Redis中最基本的数据类型,可以存储任何类型的字符串,包括二进制数据。String类型是二进制安全的,意味着它可以包含任何数据,如图片、序列化对象等。
特点:
单一数据,最简单的数据类型。
一个key对应一个value,value最大可以是512MB。
字符串操作是原子的,即这些操作在执行过程中不会被其他命令打断。
应用场景:
缓存功能:如缓存用户信息、商品信息等。
计数器:如视频播放数、微博的点赞数等。
共享session:在集群模式下,Redis可以作为session共享的中心。
list列表
## List(列表)
定义:List是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
特点:
列表是有序的,可以重复。
底层实现是双向链表,支持快速的头部和尾部操作。
列表可以包含的最大元素数量是2^32 - 1(约42亿)。
应用场景:
消息队列:生产者将任务推入list,消费者从list中取出任务执行。
最新消息排行榜:如新闻网站的最新新闻列表
set集合
## Set(集合)
定义:Set是一个无序的、不包含重复元素的字符串集合。
特点:
自动去重。
底层实现是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。
Set可以包含的最大元素数量是2^32 - 1(约42亿)。
应用场景:
交集、并集、差集操作:如求两个用户的共同好友。
唯一性应用:如统计访问网站的所有独立IP。
hash哈希
## Hash(哈希)
定义:Hash是一个键值对集合,是一个string类型的field和value的映射表。Hash特别适合用于存储对象。
特点:
字段(field)和值(value)都是字符串类型。
可以在O(1)时间复杂度内完成添加、删除、查找操作。
每个Hash可以存储的最大键值对数量是2^32 - 1(约42亿)。
应用场景:
存储、读取、修改用户属性(如name、age、pwd等)。
sorted set有序集合
## sorted set
定义:Sorted Set(有序集合)是一个不允许重复成员的字符串集合,每个成员都会关联一个double类型的分数(score)。Redis通过分数来为集合中的成员进行从小到大的排序。
特性:
元素唯一:与Set一样,Sorted Set中的元素也是唯一的,不允许重复。
分数排序:每个元素都关联一个分数,Redis根据这个分数来对集合中的元素进行排序。
分数可重复:尽管元素是唯一的,但分数是可以重复的,这意味着可以有多个元素具有相同的分数。
应用场景
实时排行榜:可以使用Sorted Set来存储用户的分数,并根据分数来实时更新排行榜。
带权重的任务调度:将任务的执行时间或优先级作为分数存储在Sorted Set中,根据分数来实现带权重的任务调度。
时间轴:使用Sorted Set来存储用户的时间线,根据时间戳来排序用户的动态。
范围查找:在Sorted Set中存储一组有序数据,并通过范围查找来获取指定范围内的数据。
计数器:通过更新Sorted Set中元素的分数来实现计数功能
redis 的软件功能
1)高速读写
2)数据类型丰富
3)支持持久化
4)多种内存分配及回收策略
5)支持事物
6)消息队列、消息订阅
7)支持高可用
8)支持分布式分片集群
企业缓存数据库解决方案对比
Memcached:
1)优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程
读写性能高。
2)缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、
架构扩容复杂度高
Redis:
1)优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分
布式分片集群、单线程读写性能极高
2)缺点:多线程读写较Memcached慢
Tair:
1)优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集
群、支撑了几乎所有淘宝业务的缓存。
2)缺点:单机情况下,读写性能较其他两种产品较慢
#### 结论
1.Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)。
2.Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景。
redis的安装
## redis 安装 源码安装
# --------1 下载源码包
wget https://download.redis.io/redis-stable.tar.gz
# --------2 创建软件(存放目录 /app 解压 创建软连接) 方便管理
[root@db01 app]# mkdir /app
[root@db01 app]# tar xf redis-stable.tar.gz
[root@db01 app]# ln -s redis-stable redis
# ---------3 进入目录 编译 && 安装
[root@db01 redis]# make && nake install
# ---------4 启动服务 redis-server &
[root@db01 redis]# which redis-server
/usr/local/bin/redis-server
[root@db01 redis]# redis-server & # 将服务放入后台
# ---------5 检查端口
[root@db01 redis]# netstat -lntup | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 19850/redis-server
tcp6 0 0 :::6379 :::* LISTEN 19850/redis-server
redis的基本配置
# 配置模板位于 安装目录下的 redis.conf
# ------ 创建redis的工作目录
[root@db01 redis]# mkdir -p /etc/redis/6379
# ------- 创建redis配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
daemonize yes # //守护进程模式启动
port 6379 # //端口
logfile /etc/redis/6379/redis.log # //日志文件位置
dir /etc/redis/6379 # //持久化数据文件存储位置
dbfilename dump.rdb # //RDB持久化数据文件名称
protected-mode no # //关闭保护模式
# ------- 指定配置文件启动redis
[root@db01 redis]# redis-server /etc/redis/6379/redis.conf
redis的安全配置
protected-mode: 禁止protected-mode yes/no (保护模式,是否只允许本地访问)
protected-mode no
bind:指定IP进行监听
#添加到配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
bind 127.0.0.1 10.0.0.51
requirepass: 增加密码
#添加配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
requirepass kjt123
#不加认证,报错
[root@db01 redis]# redis-cli
127.0.0.1:6379> set name zhangsan
(error) NOAUTH Authentication required.
#连接方式1 进去auth
[root@db01 redis]# redis-cli
127.0.0.1:6379> AUTH kjt123
127.0.0.1:6379> set name zhangsan
OK
#连接方式2 连接时 -a 指定密码
[root@db01 redis]# redis-cli -a kjt123
127.0.0.1:6379> set name lisi
OK
redis在线查看修改配置
#查看配置文件中的监听地址
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "127.0.0.1 10.0.0.51"
#查看dir
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/etc/redis/6379"
#查看所有配置
127.0.0.1:6379> CONFIG GET *
#修改配置,即时生效
127.0.0.1:6379> CONFIG SET requirepass 123
OK
#测试修改后连接
[root@db01 redis]# redis-cli -a 123
127.0.0.1:6379> set age 18
OK
#查看配置文件
[root@db01 redis]# cat /etc/redis/6379/redis.conf
daemonize yes
port 6379
logfile /etc/redis/6379/redis.log
dir /etc/redis/6379
dbfilename dump.rdb
bind 127.0.0.1 10.0.0.51
redis的多实例 开多个端口
# 编辑多个不同的配置文件 启动不同的redis
# 配置文件的大概思路
daemonize yes # //守护进程模式启动
port nnnn # //端口
logfile /etc/redis/nnnn/redis.log # //日志文件位置
dir /etc/redis/nnnn # //持久化数据文件存储位置
dbfilename dump.rdb # //RDB持久化数据文件名称
protected-mode no # //关闭保护模式
# 启动redis的多实例
[root@db01 redis-stable]# redis-server /data/6380/redis/redis6380.conf
[root@db01 redis-stable]# redis-server /data/6381/redis/redis6381.conf
[root@db01 redis-stable]# redis-server /data/6500/redis/redis6500.conf
# 测试多实例连接
[root@db01 redis-stable]# redis-cli -p 6380
127.0.0.1:6380>
[root@db01 redis-stable]# redis-cli -p 6381
127.0.0.1:6381>
[root@db01 redis-stable]# redis-cli -p 6500
127.0.0.1:6500>