Redis
Redis
高并发缓存
什么是缓存
在计算机中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存储位置快。通过缓存,您可以高效地重用之前检索或计算的数据。
计算机体系中各级缓存
为什么要用缓存
场景
在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。
在集群环境下,常用的分布式缓存有Redis、Memcached等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。
实现缓存方案
基于JSR107规范自研
基于ConcurrentHashMap实现数据缓存
JSR107规范
基于ConcurrentHashMap实现数据缓存
Redis5.x
方式/方法:
redis是什么 为什么要学习redis redis怎么用
介绍
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。从2015年6月开始,Redis的开发由Redis Labs赞助,而2013年5月至2015年6月期间,其开发由Pivotal赞助。[3]在2013年5月之前,其开发由VMware赞助。[4][5]根据月度排行网站DB-Engines.com的数据,Redis是最流行的键值对存储数据库。
Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一 个开源的使用
ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库 ,并提供多种语言的API。
本质是客户端-服务端应用软件程序。
特点是使用简单、性能强悍、功能应用场景丰富。
BSD是"Berkeley Software Distribution"的缩写,意思是"伯克利软件发行版"。
BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作
为开源或者专有软件再发布。BSD代码鼓励代码共享,但需要尊重代码作者的著作权。
BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商
业集成很友好的协议。Linux也是遵循BSD
NOSQL
NoSQL,泛指非关系型的数据库,NoSQL即Not -0nly SQL,它可以作为关系型数据库的良好补充。随着互联网web2.0网
站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速
而传统的关系数据库在应付web2.0网站,特别是超大规模和高井发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
1、High per formance - 对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静志化技术,因此
数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次
SQL写数据请求,硬盘I0就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实
时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。2、Huge storage -对海量数据的高效率存储和访问的需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Fr iendfeed为例,一个月
就达到了2.5亿条用户动态,对于关系数据库来说,在一张2 .5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可
忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中数据库是 最难进行横向扩展的,当一个应用系 統的用户量和访问量与日俱增的时候 ,你的数据库却
没有办法像web server 和app server 那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需
要提供24小时不问断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,
为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题
NoSQL的类别
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value
就显得效率低下了相关产品: Tokyo Cabinet/Tyrant. Redis. Voldemort. Berkeley DB
典型应用:内容缓存,主要用于处理大量数据的高访问负载。
数据模型:一 系列键值对
优势:快速查询
劣势:存储的数据缺少结构化
mysql优化:
50个字段 100万条数据
2个字段 500万条数据
列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列
家族来安排的。相关产品: Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
文档型数据库
文档型数据车的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。 该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON,文档型数据库可以看作是键值数据库的升级版,允许之间嵌
套键值。而且文档型数据库比键值数据库的查询效率更高。相关产品: CouchDB、MongpDB
典型应用: Web应用(与Key-Va lue类似,value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统一-的查询语法
图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务
器上。NOSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL 数据库都有REST式
的数据接口或者查询API.相关数据库: Neo4J、InfoGrid. Infinite Gr aph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
总结:
因此,我们总结NoSQL数据库在以下的这几种情况下比较使用:
- 数据模型比较简单;
- 需要灵活性更强的IT系统;
- 对数据库性能要求较高;
- 不需要高度的数据一致;
- 对于给定key,比较容易映射复杂值的环境
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题
(高并发)。
MySQL性能
下面是官方的bench-mark数据: [1]
测试完成了50个并发执行100000个请求。
设置和获取的值是一个256字节字符串。
Linux box是运行Linux 2.6,这是X3320 Xeon 2.5 ghz。
文本执行使用loopback接口(127.0.0.1)。
结果:读的速度是110000次/s,写的速度是81000次/s 。
Redis历史
2008年,意大利的一-家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG ,然而没过多久该公司的创始
人Ealvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做-一个数据库,并于2009年
开发完成,这个数据库就是Redis.不过Salvatore Sanfilippo并不满足只将Redis 用于LL0OGG这一款产品,而是希
望更多的人使用它,于是在同一年Salvatore Sanfili ppo将Redis开源发布,并开始和Redis的另一名主要的代码责
献者Pieter Noor dhuis-起继续着Redis的开发,直到今天。
Salvatore Sanfilippo自 己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012
年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis.国内如新浪微博、街旁网、知乎网,国外如
GitHub、Stack overflow、Flickr等都是Redis的用户。
VMwar e公司从2010年开始赞助Redis的开发,salvatore Sanfili ppo和Pieter Noor dhuis也分别在3月和5月加
入VMware ,全职开发Redis.
redis的作者,他叫SalvatoreSanfilippo ,来自意大利的西西里岛,现在居住在卡塔尼亚。
代码开源。地址是antirez.com ,当然也可以去follow他的github ,地址是http://github.com/antirez.
Redis描述
什么是Redis
Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一 个开源的使用
ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库 ,并提供多种语言的API。
Redis特点
-
性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s
-
丰富的数据类型- Redis支持的类型String, Hash,List, , Set及Ordered Set数据类型操作。
-
原子性- Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性
的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 -
丰富的特性- Redis还支持publish/subscribe, 通知, key过期等等特性。
-
高速读写, redis使用自己实现的分离器,代码量很短,没有使用lock ( MySQL ) ,因此效率非常高。
Redis是一个简单的,高效的,分布式的,基于内存的缓存工具。
架设好服务器后,通过网络连接(类似数据库) , 提供Key - value式缓存服务。
简单,是Redis突出的特色。
简单可以保证核心功能的稳定和优异。
Redis的应用场景
企业级开发中:
可以用作数据库、缓存、热点数据(经常会被查询,但是不经常被修改或者删除的数据)
和消息中间件等大部分功能。
redis常用的场景示例如下:
1、缓存
缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压
力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redi s用在缓存的场合非常多。2、排行榜
很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现
各种复杂的排行榜应用。3、计数器
什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量
高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常
好,非常适用于这些计数场录。
4、分布式会话
集群模式下,在应用不多的情况下一-般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般
都会措建以Redis等内存数据库为中心的sessi on服务, session不再由容器管理,而是由session服务及内存数据库管理。5、分布式锁
在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID.减库存、
秒杀等场景,并发量不大的场录可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资
源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1
说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多.6、社交网络
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库
类型不适合存储这种类型的数据, Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。7、最新列表
Redis列表结构,LPUSH可以在列表头部插入-一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个
ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。8、消息系统
消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、 Kafka等流行的消息队列中间件,主要用于业务解耦、流量
削峰及异步处理实时性低的业氛Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个
不能和专业的消息中间件相比。
Redis总结
Redis优势
-
性能极高- Redis能读的速度是1 10000次/s写的速度是81000次/s。
-
丰富的数据类型- Redis支持的类型String, Hash,List, , Set及Ordered Set数据类型操作。
-
原子性- Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性
的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 -
丰富的特性- Redis还支持publish/subscribe,通知, key过期等等特性。
-
高速读写, redis使用自己实现的分离器,代码量很短,没有使用lock ( MySQL) ,因此效率非常高。
Redis缺点
- 持久化。Redis直接将数据存储到内存中,要将数据保存到磁盘上, Redis可以使用两种方式实现持久化过程。
定时快照( snapshot) :每隔一 段时间将整个数据库写到磁盘上,每次均是写全部数据,代价非常高。第二
种方式基于语句追加( aof) :只追踪变化的数据,但是追加的log可能过大,同时所有的操作均重新执行一
遍,回复速度慢。 - 耗内存,占用内存过高。
- xhoang
Redis安装服务端
官网地址: https://redis.io/
文档 :
中文社区: http://www.redis.cn
io 是[british indian ocean territory] 英属印度洋领地的简写
英国英属印度洋领地在互联网域名系统中拥有的国家及地区顶级域(ccTLD
windows安装
Redis3.0-win版本微软已停止更新,Redis 官网描述 Redis is not officially supported on Windows. However, you can install Redis on Windows for development by following the instructions below.
Redis在Windows上不被官方支持。然而,你可以按照下面的说明在Windows上安装Redis用于开发。可以通过安装或者启用 WSL2 来安装Redis
Windows安装Redis
链接:https://github.com/microsoftarchive/redis
非官方在持续更新
链接:https://github.com/tporadowski/redis
Releases · binghe021/redis-setup (github.com)
2.下载安装包msi直接安装;下载压缩包需要将服务安装到电脑,进入安装目录cmd,redis-server.exe --service-install redis.windows.conf --service-name redisserver --loglevel verbose
3.配置redis.windows.conf(requirepass password)
4.登录auth password
Windows WSL2安装Redis
待补充
Centos中安装
参考官网安装:https://redis.io/download
Redis是C语言开发,安装Redis需要先将官网下载的源码进行编译,编译依赖gcc环境
root登录联网
# gcc安装
yum install gcc gcc-c++ make automake autoconf -y
# 下载redis-5.0.0.tar.gz
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
# 创建redis目录
mkdir /usr/local/redis
# 解压
tar xzf redis-5.0.0.tar.gz
# 查看/usr/local/redis是否解压redis-5.0.0.tar.gz
ll /usr/local/redis
# 编译
cd /usr/local/redis/redis-5.0.0
安装成功显示:
CC rax.o
CC t_stream.o
CC listpack.o
CC localtime.o
CC lolwut.o
CC lolwut5.o
LINK redis-server
INSTALL redis-sentinel
CC redis-cli.o
LINK redis-cli
CC redis-benchmark.o
LINK redis-benchmark
INSTALL redis-check-rdb
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: 离开目录“/usr/local/redis/redis-5.0.0/src”
指定安装位置
make PREFIX=/usr/local/redis install
(安装编译后的文件) 安装到指定目录:
注意:PREFIX必须大写、同时会自动为我们创建redis目录,并将结果安装此目录
卸载
#查看进程
ps aux |grep redis
#杀掉进程
kill -9 进程号
#查看相关文件
find / -name "redis"
#删除文件
rm -rf 文件
启动Redis客户端
在redis的安装目录中有redis的客户端,即redis-cli ( Redis Command Line Interface ),
它是Redis自带的基于命令行的Redis客户端
进入Redis客服端( Clone Session克隆一个窗口 )
进入对应的安装目录
cd /usr/1oca1/redis
执行命令:
./bin/redis-cli
启动Redis客户端命令语法:
redis-cli -h IP地址-p端口//默认IP本机 端口6379
退出客户端命令: Ctrl+C
检测是否服务端启动
启动redis客户端,打开终端并输入命令redis-cli。 该命令会连接本地的redis服务。
redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
可参考:https://blog.csdn.net/ai_64/article/details/101042895
(331条消息) Redis 6.2.7安装配置_那小子很拽的博客-CSDN博客 比较全面
Docker安装Redis
官方介绍docker 安装 Redis
redis默认只支持本地使用,如何开启远程连接,可以远程访问远程redis服务器呢
开启远程连接的一般步骤
- 屏蔽本地绑定信息
- 添加requirepass
- 重启redis
- 将redis端口加入防火墙规则
远程连接
配置好Redis服务并重启服务后。就可以使用客户端远程连接Redis服务了。命令格式如下:
$ redis-cli -h {redis_host} -p {redis_port}
其中{redis_host}就是远程的Redis服务所在服务器地址,{redis_port}就是Redis服务端口(Redis默认端口是6379)。
————————————————
版权声明:本文为CSDN博主「goodjob110」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lazycheerup/article/details/90348468
根据自己的redis.conf生成redis镜像的容器
$docker run -p 6380:6379 --name myredis
-v /docker/myredis:/usr/local/etc/redis/redis.conf
-d redis:4.0.11
redis-server /usr/local/etc/redis/redis.conf/redisbydocker.conf
-p 6380:6379是将自己服务器上的6380端口映射到容器的6379端口,对外暴露6380端口,使用户通过对外暴露的6380端口访问redis容器内部的服务。
-v /docker/myredis:/usr/local/etc/redis/redis.conf
-v /宿主机绝对路径:/容器内目录 (v为volume缩写(体积;卷))
具体含义为:将本地的 /docker/myredis目录与redis容器内部的/usr/local/etc/redis/redis.conf目录关联起来(注意redis.conf在这里是目录)。目的是当在本机的/docker/myredis创建修改配置文件时,redis内部同样被修改。
-d redis:4.0.11 后台启动镜像,生成容器
redis-server /usr/local/etc/redis/redis.conf/redisbydocker.conf 启动redis-server使用在/usr/local/etc/redis/redis.conf目录下的redisbydocker.conf配置文件。
————————————————
版权声明:本文为CSDN博主「nero_claudius」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nero_claudius/article/details/84633100
启动docker
systemctl start docker
docker images
docker pull redis
docker pull redis:latest #拉取最新版本
docker pull redis:5.0.8 #指定版本
docker images
docker run -d --name myredis -p 6379:6379 redis --requirepass "123456"
mkdir /home/docker/redis/{conf,data} -p
阿里云是否开启防火墙
检查Redis Server是否启动
ps -ef | grep redis
Redis官网下载redis.conf:http://download.redis.io/redis-stable/redis.conf
mkdir -p /root/docker/redis/data /root/docker/redis/conf
mkdir -p /usr/local/redis/{data,conf}
自定义redis.conf启动
下载配置文件到指定目录
wget -P /usr/local/redis/conf http://download.redis.io/redis-stable/redis.conf
修改配置文件
vi /usr/local/redis/redis.conf
- 进入文件命令模式后,输入‘/bind 127.0.0.1’查找关键字找到对应的行,输入‘N’查找下一个
- 找到所在行后输入字母‘i’ 进入编辑模式,在第一位字母前面加上‘#’注释行。
- 按‘ESC’进入命令行模式输入‘:wq’ 保存文件并退出,完成配置文件的编辑
启动 docker
run
[OPTIONS]
IMAGE
[COMMAND]
[ARG...]
官方网址:https://docs.docker.com/engine/reference/commandline/run/
docker run -tid --name myredis -p 6379:6379 -v /usr/local/redis/data:/data -v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf --requirepass 123456 --appendonly yes
docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis:latest redis-server /usr/local/etc/redis/redis.conf
https://blog.csdn.net/u011191463/article/details/83383404
docker run 命令缩写:
--tty = -t 终端入口
--interactive = -i 带交互的容器
--detach = -d 后台运行的容器
--volume = -v 数据盘
$PWD
--name myredis
-v /docker/myredis:/usr/local/etc/redis/redis.conf
-v /宿主机绝对路径:/容器内目录 (v为volume缩写(体积;卷))
具体含义为:将本地的 /docker/myredis目录与redis容器内部的/usr/local/etc/redis/redis.conf目录关联起来(注意redis.conf在这里是目录)。目的是当在本机的/docker/myredis创建修改配置文件时,redis内部同样被修改。
docker run \
-p 6379:6379 \
-v /usr/mine/program/docker/redis/data:/data \
-v /usr/mine/program/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
--privileged=true \
--name myredis \
-d docker.io/redis:latest redis-server /etc/redis/redis.conf
docker run \
-p 6379:6379 \ # 端口映射 宿主机:容器
-v /docker/redis/data:/data:rw \ # 映射数据目录 rw 为读写
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf:ro \ # 挂载配置文件 ro 为readonly
--privileged=true \ # 给与一些权限
--name myredis \ # 给容器起个名字
-d docker.io/redis:latest redis-server /etc/redis/redis.conf # deamon 运行 服务使用指定的配置文件
其实在文档之前我是遇到一个BUG的,docker ps什么都没有,百度了一下是因为权限问题。
查看容器: sudo docker ps
进入容器 : sudo docker exec -it 【容器id】 /bin/bash
远程访问redis : redis-cli -h 【ip地址】 -p 【端口】-a 【密码】
从官网获取 redis.conf 配置文件
- 修改默认配置文件
- bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
- protected-mode no #默认yes,开启保护模式,限制为本地访问
- daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程(可选),改为yes会使配置文件方式启动redis失败
- dir ./ #输入本地redis数据库存放文件夹(可选)
- appendonly yes #redis持久化(可选)
问题原因及解决办法
原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数:
docker run -i -t -v /soft:/soft --privileged=true 686672a1d0cc /bin/bash(我选择了这种)
2.临时关闭selinux:
setenforce 0
3.添加selinux规则,改变要挂载的目录的安全性文本
$ chcon -Rt svirt_sandbox_file_t /docker/redis/data
解决方案:Docker挂载主机目录Docker访问出现Permission denied的解决办法
参考资料:https://www.jianshu.com/p/ede209c259a9
docker exec -it myredis bash
没有redis.conf
1.修改redis.conf文件,将 bind 127.0.0.1这一行注释掉,或是将127.0.0.1修改为0.0.0.0
(redis默认只支持本地连接,修改为0.0.0.0时,这样就可以支持外机连接了)
2.修改redis.conf文件,将protected-mode yes 改为no
(解除保护模式,也是DENIED Redis is running in protected mode because protected mode is enabled问题的解决)
要是云的服务机还需要将服务器安全设置里面打开需要的端口
3.重启redis服务
- redis-benchmark redis性能测试工具
- redis-check-aof AOF文件修复工具
- redis-check-rdb RDB文件修复工具
- redis-cli redis命令行客户端
- redis.conf redis配置文件
- redis-sentinal redis集群管理工具
- redis-server redis服务进程
注意:
sudo docker rm f0453552d7f2
Error response from daemon: No such container: f0453552d7f2
# 移除 docker rm target_name # 强制移除 docker rm -f target_name
docker run --name myredis -p 6379:6379 -v /root/docker/redis/data:/data -v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf --appendonly yes
docker run -p 6379:6379 --name myredis -v /root/docker/redis/redis.conf:/etc/redis/redis.conf -v /root/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
# -p 6379:6379:把容器内的6379端口映射到宿主机6379端口
# -v /root/docker/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
# -v /root/docker/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
# redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
# -appendonly yes:redis启动后数据持久化
docker run redis # 从redis镜像运行容器
-p 6379:6379 # 映射本地6379端口到容器6379端口,前为本地端口
--name redis # 设置容器名称为redis,方便以后使用docker ps进行管理
-v /docker/redis/redis.conf:/etc/redis/redis.conf # 关联本地/docker/redis/redis.conf文件到容器中/etc/redis/redis.conf,同样,前为本地
-v /docker/redis/data:/data # 关联本地/docker/redis/data到容器内/data目录,此为存放redis数据的目录,为方便以后升级redis,而数据可以留存
-d # 后台启动,使用此方式启动,则redis.conf中daemonize必须设置为no,否则会无法启动
redis-server /etc/redis/redis.conf # 在容器内启动redis-server的命令,主要是为了加载配置
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS说明:
- -f :指定返回值的模板文件。
- -s :显示总的文件大小。
- --type :为指定类型返回JSON。
[root@popeye ~]# docker exec -it redis-6379 bash
root@f2c4856e5aa1:/data# pwd
/data
root@f2c4856e5aa1:/data#
卸载Redis
停服务、删文件即可!
#查看进程
ps aux |grep redis
#杀掉进程
kill -9 进程号
#查看相关文件
find / -name "redis"
#删除文件
rm -rf 文件
https://blog.csdn.net/u011191463/article/details/83383404
Redis可视化工具
AnotherRedisDesktopManager 一款比较稳定简洁的 redis UI 工具。
Redis Desktop Manager 一款基于Qt5的跨平台Redis桌面管理软件,目前已开始收费。可下载在GitHub下载其他修改版本
Redis Client 是Redis客户端的GUI工具,使用Java swt和jedis编写,可以方便开发者浏览Redis数据库。该软件支持简体中文,非常适合国内用户使用,不需要汉化就可以直接使用
Redis的默认配置
Redis的配置文件位于Redis安装目录下,文件名为redis.conf
持久化机制:将内存中的数据存储到硬盘中,默认使用方式dump.rdb
Redis默认定义了很多默认配置。但在实际开发中,-般我们都会通过手动配置完成。
回到安装目录下找到解压文件中的reids.conf
配置Redis
命令:解压目录下的redis.conf配置文件复制 到安装文件的目录下
cp /opt/redis-5.0.0/redis.conf /usr/1oca1/redis/
redis.conf
#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize yes
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode yes
#redis的进程文件
pidfile /var/run/redis/redis-server.pid
#redis监听的端口号。
port 6379
#此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,
#而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,
#对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p。
tcp-backlog 511
#指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
#bind 127.0.0.1
#配置unix socket来让redis支持监听本地连接。
# unixsocket /var/run/redis/redis.sock
#配置unix socket使用文件的权限
# unixsocketperm 700
# 此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0。
timeout 0
#tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。
#在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
tcp-keepalive 0
#指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),
#notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)
loglevel notice
#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
logfile /var/local/redis5/logs/redis-server.log
#是否打开记录syslog功能
# syslog-enabled no
#syslog的标识符。
# syslog-ident redis
#日志的来源、设备
# syslog-facility local0
#数据库的数量,默认使用的数据库是DB 0。可以通过SELECT命令选择一个db
databases 16
# redis是基于内存的数据库,可以通过设置该值定期写入磁盘。
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000
#当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes
#使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间
rdbcompression yes
#是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,
#但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。
rdbchecksum yes
#rdb文件的名称
dbfilename dump.rdb
#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir /var/local/redis5/data/
############### 主从复制 ###############
#复制选项,slave复制对应的master。
# slaveof <masterip> <masterport>
#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。
# masterauth <master-password>
#当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。2) 如果slave-serve-stale-data设置为no,
#除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。
slave-serve-stale-data yes
#作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)。
slave-read-only yes
#是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,
#master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,
#直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。
#socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。
repl-diskless-sync no
#diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。
repl-diskless-sync-delay 5
#slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认10秒。
# repl-ping-slave-period 10
#复制连接超时时间。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。
# slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时。
# repl-timeout 60
#是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,
#在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。
repl-disable-tcp-nodelay no
#复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。这样在slave离线的时候,不需要完全复制master的数据,如果可以执行部分同步,
#只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。缓冲区的大小越大,slave离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。
# repl-backlog-size 5mb
#master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。
# repl-backlog-ttl 3600
#当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。
slave-priority 100
#redis提供了可以让master停止写入的方式,如果配置了min-slaves-to-write,健康的slave的个数小于N,mater就禁止写入。
#master最少得有多少个健康的slave存活才能执行写命令。这个配置虽然不能保证N个slave都一定能接收到master的写操作,但是能避免没有足够健康的slave的时候,
#master不能写入来避免数据丢失。设置为0是关闭该功能。
# min-slaves-to-write 3
#延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。
# min-slaves-max-lag 10
# 设置1或另一个设置为0禁用这个特性。
# Setting one or the other to 0 disables the feature.
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.
############### 安全相关 ###############
#requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。这让redis可以使用在不受信任的网络中。为了保持向后的兼容性,
#可以注释该命令,因为大部分用户也不需要认证。使用requirepass的时候需要注意,因为redis太快了,每秒可以认证15w次密码,简单的密码很容易被攻破,所以最好使用一个更复杂的密码。注意只有密码没有用户名。
# requirepass foobared
#把危险的命令给修改成其他名称。比如CONFIG命令可以重命名为一个很难被猜到的命令,这样用户不能使用,而内部工具还能接着使用。
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#设置成一个空的值,可以禁止一个命令
# rename-command CONFIG ""
############### 进程限制相关 ###############
# 设置能连上redis的最大客户端连接数量。默认是10000个客户端连接。由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接等,
# 所以maxclients最小建议设置到32。如果超过了maxclients,redis会给新的连接发送’max number of clients reached’,并关闭连接。
# maxclients 10000
#redis配置的最大内存容量。当内存满了,需要配合maxmemory-policy策略进行处理。注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。
# maxmemory <bytes>
#内存容量超过maxmemory后的处理策略。
#volatile-lru:利用LRU算法移除设置过过期时间的key。
#volatile-random:随机移除设置过过期时间的key。
#volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
#allkeys-lru:利用LRU算法移除任何key。
#allkeys-random:随机移除任何key。
#noeviction:不移除任何key,只是返回一个写错误。
#上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。redis将不再接收写请求,只接收get请求。
#写命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。
# maxmemory-policy noeviction
#lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除。
# maxmemory-samples 5
############### APPEND ONLY 持久化方式 ###############
#默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,
#根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,
#每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendonly no
#aof文件名
appendfilename "appendonly.aof"
#aof持久化策略的配置
#no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
#always表示每次写入都执行fsync,以保证数据同步到磁盘。
#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
appendfsync everysec
# 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,
#no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,
#这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。
no-appendfsync-on-rewrite no
#aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。
#当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
#设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
auto-aof-rewrite-min-size 64mb
#aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,
#尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。
#如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。
aof-load-truncated yes
############### LUA SCRIPTING ###############
# 如果达到最大时间限制(毫秒),redis会记个log,然后返回error。当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀。
lua-time-limit 5000
############### 集群相关 ###############
#集群开关,默认是不开启集群模式。
# cluster-enabled yes
#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有Redis生成并更新,
#每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
# cluster-config-file nodes-6379.conf
#节点互连超时的阀值。集群节点超时毫秒数
# cluster-node-timeout 15000
#在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,
#这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:
#比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period
#如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
# cluster-slave-validity-factor 10
#master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
# cluster-migration-barrier 1
#默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,
#这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。
# cluster-require-full-coverage yes
############### SLOW LOG 慢查询日志 ###############
###slog log是用来记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。
#执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。
slowlog-log-slower-than 10000
#慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。
slowlog-max-len 128
############### 延迟监控 ###############
#延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。只记录大于等于下边设置的值的操作。
#0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。
latency-monitor-threshold 0
############### EVENT NOTIFICATION 订阅通知 ###############
#键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
#notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
##K 键空间通知,所有通知以 __keyspace@__ 为前缀
##E 键事件通知,所有通知以 __keyevent@__ 为前缀
##g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
##$ 字符串命令的通知
##l 列表命令的通知
##s 集合命令的通知
##h 哈希命令的通知
##z 有序集合命令的通知
##x 过期事件:每当有过期键被删除时发送
##e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
##A 参数 g$lshzxe 的别名
#输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何 通知被分发。详细使用可以参考http://redis.io/topics/notifications
notify-keyspace-events ""
############### ADVANCED CONFIG 高级配置 ###############
#数据量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hash
hash-max-ziplist-entries 512
#value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash。
hash-max-ziplist-value 64
#数据量小于等于list-max-ziplist-entries用ziplist,大于list-max-ziplist-entries用list。
list-max-ziplist-entries 512
#value大小小于等于list-max-ziplist-value的用ziplist,大于list-max-ziplist-value用list。
list-max-ziplist-value 64
#数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set。
set-max-intset-entries 512
#数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset。
zset-max-ziplist-entries 128
#value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset。
zset-max-ziplist-value 64
#value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense)。
#一个比16000大的value是几乎没用的,建议的value大概为3000。如果对CPU要求不高,对空间要求较高的,建议设置到10000左右。
hll-sparse-max-bytes 3000
#Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,
#不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
activerehashing yes
##对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。
#对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。
client-output-buffer-limit normal 0 0 0
#对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit slave 256mb 64mb 60
#对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60
#redis执行任务的频率为1s除以hz。
hz 10
#在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
aof-rewrite-incremental-fsync yes
redis.conf4.x 前10个配置
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no当Redis以守护进程方式运行时,Redis默认会把pid写入/var /run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid指定Redis监听端口,默认端口为6379,作者在自己的一-篇博文中解释了为什么选用6379作为默认端口,因为
6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Mer z的名字
port 6379绑定的主机地址
bind 127.0.0.1当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300指定日志记录级别,Redis总共支持四个级别: debug、verbose、 notice. warning,默认为ver bose
logleve1 verbose日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/nu11
logfile stdout设置数据库的数量T默认数据库为0,可以使用SELECT
命令在连接上指定数据库id databases 16 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒( 15分钟)内有1个更改,300秒( 5分钟)内有10个更改以及60秒内有10000个更改。
- 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF (压缩算法)压缩,如果为了节省CPU时间。
可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
中间10个
**11.指定本地数据库文件名,默认值为dump. r db
dbfilename dump. rdb**12.指定本地数据库存放目录
dir ./13.设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof
- 当mast er服务设置了密码保护时,s1av服务连接master的密码
masterauth <master -password>**15.设置Redis连接密码,如果配置了连接密码,喜户端在连接Redis时需要通过AUTH
命令提供密码
默认关闭
requir epass foobared16.设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文
件描述符数,如果设置maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端
返回max number of clients reached错误信息
maxclients 12817.指定Redi s最大内存限制, Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或
即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis
新的vm机制,会把Key存放内存,value会存放在swap区
maxmemory18.指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断
电时导致一段时间内的数据丢失。 因为redis本身同步数据文件是按上面s ave条件来同步的,所以有的数据会在一段时间
内只存在于内存中。默认为no
appendonly no19.指定更新日志文件名,默认为appendonly . aof
appendfi 1 ename appendonly. aof20.指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always : 表示每次更新操作后手动调用fsync O将数据写到磁盘(慢,安全)
everysec :表示每秒同步一次(折衷,默认值)appendtsync everysec
结尾十个
21.指定是否启用虚拟内存机制,默认值为no,简单的介紹一下,VM机制将数据分页存放,由Redis将访问量较少的页即
冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no22.虚拟内存文件路径,默认值为/tmp/redis . swap,不可多个Redis实例共享
vm-swap-file /tmp/r edis .swap23.将所有大于vm-max -memory的数据存入虚拟内存,无论vm-max -memory设置多小,所有索引数据都是内存存储的
(Redis的索引数据就是keys),也就是说,当vm- max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值
为0
- Redis swap文件分成了很多的page,一个对象可以保存在多个page上面;但一-个page上不能被多个对象共享,
vm-page-si ze是要根据存储的数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者
64bytes ;如果存储很大大对象,则可以使用更大的page,如果不确定,就使用默认值
vm-page-size 3225.设置swap文件中的page数量, 由于页表( -种表示页面空闲或使用的bitmap )是在放在内存中的,, 在磁盘上每8个pages将消耗1byt e的内存。
vm-pages 13421772826.设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0 ,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 427.设置在向客户端应答时,是否把较小的包合并为一一个包发送,默认为开启
glueoutputbuf yes28.指定在超过一定的数量或者最大的元素超过某一-临界值时 ,采用一种特殊的哈希算法
hash-max-zi pmap-entries 64
hash-max-zi pmap-value 51229,指定是否激活重置哈希,默认为开启(后面在介绍Redi s的哈希算法时具体介绍)
activer ehashing yes30.指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/loca1. conf
Redis中的内存维护策略
redis作为优秀的中间缓存件,时常会存储大量的数据,即使采取了集群部署来动态扩容,也应该即时的整理内存,维持系统性能。
在Redis中有两种解决方案
1、为数据设置超时时间
设置过期时间
expire key time (以秒为单位)--这是最常用的方式
setex(String key, int seconds, String value)--字符串独有的方式
- 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间
- 如果没有设置时间,那缓存就是永不过期
- 如果设置了过期时间,之后又想让缓存永不过期,使用persist key
2、采用LRU算法动态将不用的数据删除
内存管理的一种页面换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,
操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。
- volatile-lru :设定超时时间的数据中,删除最不常使用的数据.
- allkeysl-ru :查询所有的key中最近最不常使用的数据进行删除,这是应用最广泛的策略.
- volatile-random :在已经设定了超时的数据中随机删除.
- allkeys-random :查询所有的key,之后随机删除.
- volatile-ttl :查询全部设定超时时间的数据,之后排序将马上将要过期的数据进行删除操作
- noeviction :如果设置为该属性,则不会进行删除操作,如果内存溢出则报错返回.
- volatile-lfu :从所有配置了过期时间的键中驱逐使用频率最少的键
- allkeys-Ifu :从所有键中驱逐使用频率最少的键
自定义配置Redis
进入对应的安装目录/usr/local/redis
修改redis.comf配置文件vim redis.conf (进 入命令模式通过/内容查找相应字符串)
daemonize no 修改为daemonize yes守护进程启动
bind 127.0.01
注释掉允许除本机外的机器访问Redis服务
requirepass 设置密码设定数据库密码(保证服务安全/有些情况下不设定密码是无法进行远程连接访问的)
Redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时 ,代表开启守护进程模式。
在该模式下redis会在后台运行 ,并将进程pid号写 入至redis.conf选项pidfile设置的文件中 ,此时redis将一
直运行,除非手动il该进程。但当daemonize选项设置成no时,当前界面将进入redis的命令行界面, exit强
制退出或者关闭连接I具(utty,xshell等)都会导致redis进程退出。
服务端开发的大部分应用都是采用后台运行的模式
requirepass设置密码。因为redis速度相当快,所以一台比较好的服务器下,-个外部用户在一秒内可以进行
15W次密码尝试,这意味着你需要设定非常强大的密码来防止暴力破解。
可以通过redis的配置文件设置密码参数,这样客户端连接到redis服务就需要密码验证,这样可以让你的
redis服务更安全
注意:运行yum时出现/var/run/yum.pid已被锁定,PID为xxx的另一个程序正在运行的问题解决
rm -f /var/run/yum.pid
flushall 清空redis缓存
redis -cli 进入redis (需要进入redis的安装目录下)
get key 查找key
del key 删除key
Redis的使用
通用命令
DEL key | 该命令用于在 key 存在时删除 key |
---|---|
DUMP key | 序列化给定 key ,并返回被序列化的值 |
EXISTS key | 检查给定 key 是否存在 |
EXPIRE key seconds | 为给定 key 设置过期时间,以秒计 |
TTL key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) |
TYPE key | 返回 key 所储存的值的类型 |
应用场景
EXPIRE key seconds EXISTS key
1、限时的优惠活动信息
2、网站数据缓存(对于-些需 要定时更新的数据,例如:积分排行榜)
3、手机验证码
4.限制网站访客访问频率(例如: 1分钟最多访问10次)
流量攻击
Key的命名建议
redis单个key允许存入512M大小
命名规范:
非关系数据库(Redis):数据与数据之间没有关联关系
zhangsan
lisi 没有关系
通过命名规范 建立联系
user:1:zhangsan
user:2:lisi
为什么不用——,mySQL中了 使用不便于区分
-
key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
-
key也不要太短 ,太短的话, key的可读性会降低;
-
在一个项目中, key最好使用统-的命名模式,例如user:123:password;
-
key名称区分大小写
数据结构
String
String类型是Redis最基本的数据类型,一个键最大能存储512MB。
String数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。
使用场景:微博数,粉丝数(常规计数)
String类型是二进制安全的。意思是redis的string可以包含任何数据。
比如序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单的字符串,数值等等。
常用命令
赋值语法:
SET KEY NAME
VALUE: (说明:多次设置name会覆盖) (Redis seT命令用于设置始定key的值。如果key
已经存储值,SET 就要写旧值,且无视类型)
命令:
SETNX key1 valpe:(not exist) 如果key1不存在。则设值井返回1。如果key1存在,则不设值并返回0: (解决
分布式锁方案之一。 只有在key不存在时设置key的值。Setnx(SET if Not exists)命令在指定的key不
存在时,为key设置指定的值)
SETEX key1 10 1x :Cexpired) 设置key1的值为1x。过期时间为10秒,10秒后key1清除( key也清除)
SETRANGE string range value:曹换字符串
取值请法:
GET KEY_ NANE :Redis GET命令用于获取指定key的值。如果key不存在。返回nil 。如果key储存的值不是
字符串类型。返回一个错误。
GETRANGE key start end :用于获取存伴在指定key中字符串的子字符串。字符事的截取范围由start 和end
两个偏移量决定(包括start和end 在内)
GETBIT key offset :对key所储存的字符串值,获取指定偏移量上的位(bit) 偏移量 ---> 从0开始
GETSET语法: GETSET KEY_ NAME VALUE :Getset 命令用于设置指定key的值,并返回key的旧值,当
key不存在时。返回ni1
STRLEN key :返回key所储存的字符串值的长度
删值语法:
DEL KEY Name : 删除指定的KEY ,如果存在,返回值数字类型。
批量写:MSET k1 v1 k2 v2,.. -次性写入多个值
批量读:MGET k1 k2 k3
GETSET name value :一次性设值和读取(返回旧值,写上新值)
自增/自减:
INCR KEY. _Name :Incr 命令将key中储存的数字值增1。如果key不存在,那么key的值会先被初始化为0
然后再执行INCR操作
自增: INCRBY KEY_ Name :增量值Incrby市令将key中储存的数字加上指定的增量值
自减: DECR KEY_ NAME
或
DECYBY KEY_ NANE减值:DECR 命令将key中储存的数字减1
:(注意这些key对应的必须是数字类型字符事。否则会出辑,)
字符串拼接: APPEND KEY_ NAME VALUE
:Append命令用于为指定的key追加至未尾。如果不存在,为其财值
字符串长度:STRLEN key
Get | 获取指定 key 的值 |
---|---|
Set | 设置指定 key 的值 |
Incr | 将 key 中储存的数字值增一 |
Decr | 将 key 中储存的数字值减一 |
Mget | 获取所有(一个或多个)给定 key 的值 |
SetNX set k v NX | 只有键key存在的时候才会设置key的值 |
Set k v XX | 只有键key不存在的时候才会设置key的值 |
应用场景
- String通常用于保存单个字符串或JSON字符串数据
- 因String是二进制安全的,所以你完全可以把一个图片 文件的内容作为字符串来存储
- 计数器(常规key-value缓存应用。常规计数:微博数,粉丝数)
安全 redis 原子性 线程安全 要么操作成功 要么失败
微博粉丝数
INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、 DECR. DECRBY等
指令来实现原子计数的效果。假如。在某种场景下有3个客户端同时读取了mynum的值(值为2)。然后对其
同时进行了加1的操作。那么.最后mynum的值一定是5。
不少网站都利用redis的这个特性来实现业务上的统计计数需求。
Hash类型Object (Map)
简介
Hash类型是String类型的field和value的映射表。或者说是一个String集合。hash特别适合用于存储对象。相比较
而言,将一个对象类型存储在Hash类型要存情在String类型里占用更少的内存空间,并对整个对象的存取。
可以看成具有KE Y和VALUE的MAP容器,该类型非常适合于存储值对象的信息。
如: uname , upass ,age等。 该类型的数据仅占用很少的磁盘空间(相比于ISON)。
Redis 中每个hash可以存储2的32次方 。1键值对( 40多亿)
Hash命令
赋值语法:
HSET KEY FIELD VALUE :为指定的KEY,设定FILD/VALUE
HMSET KEY FIELD VALUE [FIELD1, VALUE1].... :同时将多个field-value (域-值)对设置到哈希表key中。
取值语法:
HGET KEY FIELD:获取存储在HASH中的值,根据F IELD得到VALUE
HMGET KEY field[field1]:获取key所有给定字段的值
HGETALL KEY:返回HASH表中所有的字段和值
HKEYS KEY : 获取所有哈希表中的字段
HLEN KEY:获取哈希表中字段的数量
删除语法:
HDEL KEY field1[field2]:删除-一个或多个HASH表字段
其它语法:
HSETNX key field value :只有在字段field 不存在时,设置哈希表字段的值
HINCRBY key field increment :为哈希表key中的指定字段的整数值加上增量increment
HINCRBYFLOAT key field increment:为哈希表key中的指定字段的浮点数值加上增量incr ement。
HEXISTS key field:查看哈希表key中,指定的字段是否存在
应用场景
Hash的应用场景: (存储-一个用户信息对象数据)
1.常用于存储一个对象
2.为什么不用string存储一个对象 ?
hash是最接近关系数据库结构的數据类型,可以将数据库一条记录或程序中一 个对象转换成hashmap存放在redis
中。
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用管通的key/value结构来存储,主要
有以下2种存储方式:
第一种方式将用户ID作为意找key ,把其他信息封装成- -个对象以序列化的方式存储,这种方式的缺点是,增加了序列
化/反序列化的开销。并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护。引入
CAS等复杂问题。
第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿。用用户ID+对应属性的名称作为唯一标识
来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户I0为重复存储,如果存在大量这样的数据,内存浪费
还是非常可观的。
总结:
Redis提供的Hash很好的解决了这个问题, Redis的Hash实际是内部存储的Value为一个HashMap ,
user id name age
-->
将对象转成JSON字符串
set user:1 {"id":1,"name":"lisi",socre:"20'} 序列化 反序列化 安全性
取的时候: JSON转成对象
user .setScore(21);
set id 1
set name lisi
hash类型?
三种特殊数据类型
Geospatial地理位置
Hyperloglog
什么是基数?
A{1,3,5,7,9}
B{1,3,5,8}
基数(不重复的元素) = 5 ,可以接受误差!
简介
Redis2.8.9版本就跟新了Hyperloglog数据结构!
Redis Hyperloglog 基数统计的算法!
优点: 占用的内存是固定,2^64不同的元素的技术,只需要12kb内存,如果要从内存角度来比较的话Hyperloglog首选!
网页UV (一个人访问一个网站多次,但是还是算作一个人W!)
传统的方法,set保存用户的id;然后就可以统计set中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;
0.81%错误率!统计UV任务,可以忽略不计的!
测试使用
如果允许容错,那么一定可以使用 Hyperloglog !
如果不允许容错,就使用set或者自己的数据类型即可!
Bitmaps
位存储
统计疫情感染人数: 0 1 0 1 0
统计用户信息,活跃,不活跃!登陆、未登录 打卡 两个状态
Bitmaps位图,数据结构!都是二进制位来进行记录,就只有0和1两个状态!
365天 = 365 1字节
使用Bitmap
一周打卡
fullshdb
事务
Redis事务本质: -组命令的集合! -个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!
一次性、顺序性、排他性!执行一些列的命令!
----队列set set set执行------
Redis没有隔离级别!
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行! Exec
Redis单条命令式保存原子性的,但是事务不保证原子性!
redis的事务:
- 开启事务()
- 命令入队()
- 执行事务()
正常执行事务!
放弃事务!
编译型异常(代码有问题! 命令有错!), 事务中所有的命令都不会被执行!
flushdb
运行时异常( 1/0 ),如果事务队列中存在语法性,那么执行命令的时候 ,其他命令式可以正常执行的,错误命令抛出异常!
监控!Watch
悲观锁:
- 很悲观,认为什么时候都会出问题,无论做什么都会加锁!
乐观锁:
- 很乐观,认为什么时候都不会出问题,所以不会.上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据,version !
- 获取version
- 更新的时候比较version
Redis监视测试
Jedis
我们要使用java来操作Redis
什么是edis是Redis官方推荐的java连接开发工具!使用Java操作Redis中间件!如果你要使用java操作redis,那么一-定要对ledis十分的熟悉!
测试
Redis客户端
常见的redis客户端介绍以及对比
Jedis api在线网址: http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/ledis.html
redisson自网地址: https://edissn.otrg/
redisson git项目地址: https://github.tcom/redisson/redisson
lettuce官网地址: https://lettuce.io/
lttuce git项目地址: https://githbub.com/lettuce-io/lettuce-core
首先,在spring boot2之后。对redis连接的支持,默认就采用了lettuce.这就-定程度说明了lettuce 和
Jedis的优劣。
概念
Java的客户端
Jedis : 是老牌的Redis的Java实现客户端,提供了比较全面的Redi s命令的支持,
Redisson : 实现了分布式和可扩展的Java数据结构。
Lettuce : 高级Redis寄户端,用于线程安全同步,异步和响应使用,支持集群,Sentine1,管道和编码器。
优点
Jedis :比较全面的提供了Redis的操作特性
Redisson :促使使用者对Redis的关注分商,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通
过Redis支持延迟队列Lettuce :基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作
可伸缩性
Jedis :使用阻塞的I/0,且其方法调用都是同步的,程序流需要等到sockets处理完I/0才能执行,不支持异步。
Jedis客户端实例不是线程安全的,所以需要通过连接地来使用Jedis.Redisson:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作
Lettuce :基于Netty框架的事件驱动的通信层,其方法调用导异步的。Lettuce的API是线程安全的。所以可以操作
单个Lettuce连接来完成各种操作lettuce能够支持redis4 ,需要java8及以上。
lettuce是基于netty实现的与r edis进行同步和异步的通信。
lettuce和jedis比较
jedis使直接连接redis server ,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个jedis
实例增加物理连接;lettuce的连接是基于Netty的,连接实例( statefulRedisconnection )可以在多个线程间并发访问,
StatefulRedisConnection是线程安全的所以一个连接实例可以满足多线程环境下的并发访问 ,当然这也是可伸缩的设计。一个连接实例不够的情况也可以按需增加连接实例。Redisson实现了分布式和可扩展的Java數据结构。和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分商,从而让使用者能够将精力更集中地放在处理业务逻辑上。
总结
优先使用Lettuce,如果需要分布式锁,分布式生集合等分布式的高级特性,添加Redisson结合使用,因为
Redisson本身对字符串的操作支持很差。在一些高并发的场景中,比如秒杀。抢票,抢购这些场景。都存在对核心资源。商品库存的争夺,控制不好,库存数
量可能被减少到负数,出现超卖的情况,或者产生唯一的一 个递增ID,由于web应用部署在多个机器上,简单的同步加锁是无法实现的,给数据库加锁的话,对于高井发,1000/s的并发,数据库可能由行锁变成表锁,性能下降会厉害。那相对而言,redis的分布式锁,相对而言,是个很好的选择,redis官方推荐使用的Redisson就提供了分布式锁和相关服务。
在官方网站列一些ava客户端访问,有: Jedis/Redisson/redis/JDBC-Redis等。其中官方推荐使用Jedis和
Redisson。常用Jedis.
Redis(REmote Dictionary Server)
5种数据结构:字符串
、哈希、列表、集合、有序集合、同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇“数据结构”,并且随着LBS(Location Based Service,基于位置服务)的不断发展,Redis3.2版本中加入有关GEO(地理信息定位)的功能
关系型数据库:数据之间有关联关系 数据存储在硬盘的文件上,需要对文件进行IO操作
非关系型数据库:数据之间没有关联关系,数据存储在内存中
下载安装:
- 官网
- 中文网 教程:http://www.redis.com.cn/redis-tutorial
- redis-cli -v (windows版)
- 解压直接可以使用:https://github.com/microsoftarchive/redis/tags
- redis.windows.conf
- redis-cli.exe
- redis-server.exe
REDIS启动出错CREATING SERVER TCP LISTENING SOCKET 127.0.0.1:6379: BIND: NO ERROR
windows下安装Redis第一次启动报错:
[2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
解决方法:在命令行中运行
redis-cli.exe
127.0.0.1:6379>shutdown
not connected>exit
然后重新运行redis-server.exe redis.windows.conf,启动成功!
命令操作:
-
redis的数据结构
redis存储的是:key,value格式的数据,其中key都是字符串,value有5中不同的数据结构
value的数据结构:
- 字符串类型:string
- 哈希类型:hash :map格式
- 列表类型:list :linkedlist格式
- 集合类型:set :不允许重复元素
- 有序集合类型:sortedset :不允许重复元素,且元素有顺序
-
字符串类型 string
- 存储 : set key value
- 获取:get key
- 删除:del key
-
哈希类型 hash
- 存储 :hset key field vlaue
- 获取:
- hget key field : 获取指定的field对应的值
- hgetall key :获取所有的field和value
- 删除:hdel key field
持久化
-
redis是一个内存数据库,当redis服务器重启,获取电脑重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
-
redis持久化机制
-
RDB:默认方式,不需要进行配置,默认就使用这种机制
在一定的间隔时间中,检测key的变化情况,然后持久化数据
- 编辑redis.windows.conf文件
# after 900 sec (15 min) if at least 1 key changed save 900 1 # after 300 sec (5 min) if at least 10 keys changed save 300 10 # after 60 sec if at least 10000 keys changed save 60 10000
-
AOF : 日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据
编辑redis.windows.conf文件
appendonly no
-
Java客户端 Jedis
- jedis: 一款java操作redis数据库的工具
- 使用步骤
- 下载包
- 导入包
SpringBoot 整合Jedis
简介
我们在使用springboot搭建微服务的时候,在很多时候还是需要redis的高速缓存来缓存一些数据,存储一些高频率访问的数据,如果直接使用redis的话又比较麻烦,在这里,我们使用jedis来实现redis缓存来达到高效缓存的目的
引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
因为SpringBoot内默认引用了jedis版本。
所以我们直接引入jedis依赖无需在配置jedis的版本号了。
application.yml
例如在application.yml中配置如下信息:
Redis参考
https://www.jianshu.com/p/cee2f13be8fa
https://www.jianshu.com/p/e5adb99233fe
https://www.jianshu.com/p/781e8ad3151b
常用命令:
/bin/redis-c
li表示连接redis客户端;
./bin/redis-cli shutdown表示断开redis客户端;
shutdown表示断开;
./bin/redis-server ./redis.conf表示重新启动redis服务
Redis集群搭建