1、redis 介绍
简介
redis 是 Remote Dictionary Server 的简称,是一个由意大利人Salvatore Sanfilippo开发的key-value存储系统,具有极高的读写性能,读的速度可达110000次/s,写的速度可达81000次/s 。与Redis类似的产品还有memcache,同样是一个基于内存的key-value存储系统,但是由于memcache数据结构单一,数据安全性低下等原因,大有被Redis取而代之的趋势。redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。目前,Vmware在资助着redis项目的开发和维护。
NoSQL数据库 ( 非关系型数据库 ) 一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如 Redis、MongoDB、BerkeleyDB 和 CouchDB 等。由于每种产品所拥有的特征不同,因此它们的应用场景也存在着一定的差异,下面仅给出简单的说明:
- 1). BerkeleyDB 是一种极为流行的开源嵌入式数据库,在更多情况下可用于存储引擎,比如 BerkeleyDB 在被 Oracle 收购之前曾作为 MySQL 的存储引擎,由此可以预见,该产品拥有极好的并发伸缩性,支持事务及嵌套事务,海量数据存储等重要特征,在用于存储实时数据方面具有极高的可用价值。然而需要指出的是,该产品的 Licence 为 GPL,这就意味着它并不是在所有情况下都是免费使用的。
- 2). 对 MongoDB 的定义为 Oriented-Document 数据库服务器,和 BerkeleyDB 不同的是该数据库可以像其他关系型数据库服务器那样独立的运行并提供相关的数据服务。从该产品的官方文档中我们可以获悉,MongoDB 主要适用于高并发的论坛或博客网站,这些网站具有的主要特征是并发访问量高、多读少写、数据量大、逻辑关系简单,以及文档数据作为主要数据源等。和 BerkeleyDB 一样,该产品的 License 同为 GPL。
- 3). Redis,典型的 NoSQL 数据库服务器,和 BerkeleyDB 相比,它可以作为服务程序独立运行于自己的服务器主机。在很多时候,人们只是将 Redi s视为 Key/Value 数据库服务器,然而事实并非如此,在目前的版本中,Redis 除了Key/Value之外还支持 List、Hash、Set 和 Ordered Set 等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis官网也进行了相应的澄清。和以上两种产品不同的是,Redis 的 License 是 Apache License,就目前而言,它是完全免费。
- 4). memcached,数据缓存服务器。为什么在这里要给出该产品的解释呢?很简单,因为笔者认为它在使用方式上和 Redis 最为相似。毕竟这是一篇关于 Redis 的技术系列博客,有鉴于此,我们将简要的对比一下这两个产品。首先说一下它们之间的最大区别,memcached 只是提供了数据缓存服务,一旦服务器宕机,之前在内存中缓存的数据也将全部消失,因此可以看出 memcached 没有提供任何形式的数据持久化功能,而 Redis 则提供了这样的功能。再有就是 Redis 提供了更为丰富的数据存储结构,如 Hash 和 Set。至于它们的相同点,主要有两个,一是完全免费,再有就是它们的提供的命令形式极为接近。
Redis 与其他 key - value 缓存产品相比,有以下特点:
- 1、Redis 支持数据的持久化,周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,重启的时候可以再次加载进行使用。
- 2、Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
- 3、Redis 支持数据的备份,即 master-slave 模式的数据备份。
- 4、Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作合并后的原子性执行。
- 5、Redis 还支持 publish / subscribe ( 发布/订阅 ),通知 key 过期 等高级特性。
安装、启动 redis
官网安装文档:https://redis.io/docs/getting-started/installation/
Redis 现在分成好几个产品:https://redis.io/comparisons/oss-vs-enterprise/
linux 安装、启动
下载地址:http://redis.io/download,下载最新 Redis 版本。
$ tar -zxvf redis-xxx.tar.gz
$ cd redis-xxx
$ sudo make && sudo make install
安装非常简单。make 成功后会在 src 文件夹下产生一些二进制可执行文件,包括 redis-server、redis-cli 等等:
$ find . -type f -executable
./redis-benchmark //用于进行redis性能测试的工具
./redis-check-dump //用于修复出问题的dump.rdb文件
./redis-cli //redis的客户端
./redis-server //redis的服务端
./redis-check-aof //用于修复出问题的AOF文件
./redis-sentinel //用于集群管理
启动 redis 服务
通过源码安装的 redis,可以通过 redis 的客户端程序 redis-cli 的 shutdown 命令来重启redis
1.redis关闭
redis-cli -h 127.0.0.1 -p 6379 shutdown
redis-cli -h 127.0.0.1 -p 6379 -a password shutdown
如果上述方式都没有成功停止redis,则可以使用 kill -9 杀死redis进程
2. redis 启动
- 方式 1:默认无密码启动方式 ./redis-server 或者 ./redis-server --port 6380 如果设置密码,这种方式启动 redis,调用时就会出现异常 Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
- 方式 2:已设置访问密码启动方式 ./redis-server redis.conf 。redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。 比如:
$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
Ubuntu 系统安装 redis
$sudo apt-get update
$sudo apt-get install redis-server启动 Redis:redis-server
查看 redis 是否启动:redis-cli ,执行完这个命令后,会打开:redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令:redis 127.0.0.1:6379> ping
以上说明我们已经成功安装了 redis。
如果是用 apt-get 或者 yum install 安装的 redis,启动后默认是守护进程,可以直接通过下面的命令 停止/启动/重启 redis
/etc/init.d/redis-server stop
/etc/init.d/redis-server start
/etc/init.d/redis-server restart
检查 Redis 服务器程序
ps -aux | grep redis # 检查Redis服务器系统进程
netstat -nlt | grep 6379 # 通过启动命令检查Redis服务器状态
redis-server is running # 通过启动命令检查Redis服务器状态
Windows 安装 Redis
下载可执行文件(exe) 然后直接运行。
redis-windows
- :https://github.com/zkteco-home/redis-windows
- :https://github.com/redis-windows/redis-windows
- :https://github.com/search?q=redis+window
Redis 服务器运行命令:Redis 安装目录 /redis-server.exe
Redis 客户端运行命令:Redis 安装目录 /redis-cli.exe
安装 Redis Stack
Redis Stack 和 Redis 关系:https://blog.csdn.net/oldgeek/article/details/135282369
关于 Redis Stack:https://redis.io/about/about-stack/
Redis Stack 是 Redis 的扩展,是将开源的 Redis 与 RediSearch、RedisJSON、RedisGraph、RedisTimeSeries 和 RedisBloom 结合在一起,允许开发人员使用后端数据平台构建实时应用程序,该平台可以在毫秒或更短的时间内可靠地处理请求,统一并简化了Redis的开发使用过程,充分提高工作效率。 并且还集成一个用于分析和优化 Redis 数据的可视化工具 RedisInsight。
Redis Stack 添加了现代数据模型和处理引擎,以提供完整的开发人员体验。除了 OSS Redis 的所有功能外,Redis Stack 还支持:
- 可查询的 JSON 文档
- 全文搜索
- 时间序列数据(摄取和查询)
- 使用 Cypher 查询语言绘制数据模型
- 概率数据结构
安装:https://zhuanlan.zhihu.com/p/685135487
window 安装 redis stack:https://blog.csdn.net/oldgeek/article/details/135322409
Redis Stack技术栈入门实战指南
:https://cloud.tencent.com/developer/article/2372538
Redis Stack 将多个领先的Redis模块集成为单个产品, 使得用户可以更轻松地利用基于 Redis 构建的搜索、文档存储、图数据和时间序列模型等,为redis开源生态和应用场景提供无限可能!
Redis Stack 主要由三部分组成。一个是 Redis Stack Server,一个是 RedisInsight,一个是 Redis Stack 客户端 SDK。
- 1. Redis Stack Server。Redis Stack Server结合了开源Redis与RediSearch、RedisJSON、RedisGraph、RedisTimeSeries和RedisBloom
- 2. RedisInsight。RedisInsight是一个强大的工具,用于可视化和优化Redis数据,使实时应用程序开发比以往任何时候都更容易,更有趣。
- 3. Redis Stack Client SDK。Redis Stack Client SDK包括Java、JavaScript和Python中领先的官方Redis客户端。这些客户端还包括我们新的对象映射库套件,它提供了开发人员友好的抽象,只需几行代码就可以让您富有成效。这些库被称为Redis OM for .NET,Node.js,Java和Python,它们也使它比以往任何时候都更容易与主要的应用程序框架集成,如Spring,ASP.NET Core,FastAPI和Express。
Redis GUI 工具
Redis可视化工具:https://blog.csdn.net/zhoujianboy/article/details/121140232
- QuickRedis 是一款 永久免费 的 Redis 可视化管理工具。它支持直连、哨兵、集群模式,支持亿万数量级的 key,还有令人兴奋的 UI。QuickRedis 支持 Windows 、 Mac OS X 和 Linux 下运行。
- RDM 是存在时间最久最古老的Redis可视化工具。基于 Qt 5 开发,支持跨平台的桌面管理工具。以前免费,现在收费。Redis Desktop Manager 2022年项目更名为 RESP.app:https://redisdesktop.com/download
- medis 布局简洁,跨平台支持。MAC 版本收费。
- TablePlus 是一个现代化的本地工具,UI优雅,redis功能相对简单,正如他的取名一样,操作非常的表单化。它允许您同时管理多个数据库,如MySQL、PostgreSQL、SQLite、microsoftsqlserver等等。
- Red 是一款在苹果app store下载的redis可视化工具。
- AnotherRedisDesktopManager 布局简洁,跨平台支持。免费。github:https://github.com/qishibo/AnotherRedisDesktopManager
- 最好用的 Redis 客户端 RedisInsight:http://redis.ac.cn/insight/
操作系统:支持 Windows、Linux、macOS 多操作系统;
Redis部署:支持 Redis、Redis Stack、Redis Enterprise Software、Redis Cloud 多种部署方式,轻松进行交互;
数据可视化
支持对数据浏览、过滤、可视化、CRUD操作;
树状视图对数据分组显示,友好导航;
JSON格式数据显示优美;
管理流和消费者组。可视化Redis Streams和使用者组,并设置自动刷新以实时显示新条目。使用Redis Pub/Sub的专用工作区来发布和消费消息。
日志分析和命令分析、解决性能问题,通过查看实时处理的命令和检查慢速命令来跟踪和调试Redis服务器。
Redis 管理工具
Redis 安装好之后,进入安装目录的 src 文件夹,会发现里面有6个可执行文件:
它们对应着6个管理 Redis 的工具:
redis-server
该工具用于启动Redis服务器,处理与客户端的对话,一个服务器可以与多个客户端连接。
在终端输入该命令,如果启动成功,就会看到Redis那幅标志性的图片:
Redis 提示说:Warning: no config file specified, using the defaultconfig. In order to specify a config file use Redis-server /path/to/Redis.conf
没有指定配置文件,当前使用的是默认配置。假如想使用位于路径 "/winner/setting/" 下的 Redis.conf 作为配置文件,使用命令 Redis-server /winner/setting/Redis.conf 即可。
Redis 提示服务器已经准备好在端口 6379 接受客户端的连接,6379 是 Redis 的默认端口。
至于为什么使用 6379 当做默认端口还有段传闻。写 Redis 的大神 Antirez 是意大利人,在意大利有个歌女名为 Alessia Merz,长期以来被 Antirez 及其朋友当作愚蠢的代名词,MERZ 对应的手机按键就是 6379,后来 Antirez 开发 Redis 时就使用这四个数字来当做默认端口。
redis-cli
该工具用于启动 Redis 客户端,发起与服务器的对话。可以使用参数来指定目标服务器的详细信息,例如:
- -h 指定服务器IP地址
- -p 指定服务器端口
- -a 指定登录密码等
示例:Redis-cli -h 192.168.1.2 -p 6300
如不指定任何参数,则默认连接 127.0.0.1 的 6379 端口。与 Redis 服务器取得连接后,就通过指令进行数据的存取、更改等操作了:
iredis (交互式Redis)
iredis (Interactive Redis,即:交互式Redis),是 Redis 的终端客户端,具有自动完成功能和语法突出显示功能。github:https://github.com/laixintao/iredis
pip install iredis
pipx install iredis
brew install iredis
apt install iredis
命令帮助:
iredis --help
Usage: iredis [OPTIONS] [CMD]...示例:
- iredis
- iredis -d dsn
- iredis -h 127.0.0.1 -p 6379
- iredis -h 127.0.0.1 -p 6379 -a <password>
- iredis --url redis://localhost:7890/3选项:
-h TEXT redis 服务器 (default: 127.0.0.1).
-p TEXT redis 服务器 端口 (default: 6379).
-s, --socket TEXT Server socket (优先于 hostname and port 配置).
-n INTEGER db 号.(优先于 dsn/url's db number)
-u, --username TEXT 认证时的用户名
-a, --password TEXT 认证时的密码
--url TEXT 连接时指定的 Redis URL (也可以设置环境变量 IREDIS_URL)
示例:
redis://[[username]:[password]]@localhost:6379/0
rediss://[[username]:[password]]@localhost:6379/0
unix://[[username]:[password]]@/path/to/socket.sock?db=0
-d, --dsn TEXT 使用[alias_dsn]中DSN配置,也可以使用环境变量IREDIS_DSN进行配置
--newbie / --no-newbie 显示命令提示和有用的帮助。
--iredisrc TEXT iredis的配置文件,默认为 ~/. ireddisrc。
--decode TEXT 解码响应,默认不解码。
--client_name TEXT 为当前连接分配一个名称。
--raw / --no-raw 对回复使用原始格式(STDOUT不是tty时的默认格式)。
但是,即使STDOUT不是tty,也可以使用 --no-raw强制格式化输出。
--rainbow / --no-rainbow 显示彩色提示。
--shell / --no-shell 允许运行shell命令,默认为True。
--pager / --no-pager 当输出对窗口来说太高时使用pager,默认为True。
--greetings / --no-greetings 启用或禁用问候信息
--verify-ssl [none|optional|required] 设置TLS证书验证策略
--prompt TEXT 提示格式 (支持插入:{client_name}, {db}, {host}, {path}, {port},{username}, {client_addr}, {client_id}).
--version 版本.
--help 帮助.
IRedis 基于 prompt_toolkit 构建,这是一个富文本命令工具项目,如果你喜欢 iredis 工具,其他类似的工具如下 dbcli:
- pgcli - Postgres客户端与自动完成和语法高亮
- mycli - MySQL / MariaDB / Percona 客户端与自动完成和语法高亮
- litecli - SQLite 客户端与自动完成和语法突出显示
- mssql-cli - Microsoft SQL Server 客户端与自动完成和语法突出显示
- athenacli - AWS 客户端 自动完成和语法高亮
- vcli - VerticaDB 客户端
- iredis - Redis 自动完成和语法高亮
redis-benchmark
该工具用于测试 Redis 在本机的性能,类似于鲁大师的跑分程序。运行之后会得到一组数据存取效率的报告:
redis-check-aof
Redis 虽然是基于内存的数据库,但是会创建并更新在硬盘上的备份,备份有两种方式,一个是把内存的数据导入dump.rdb文件中,另一中就是将每个执行过的命令记录到 AOF 文件中。该工具用于检查、修复 AOF 文件。
redis-check-dump
与 Redis-check-aof 类似,该工具用于检查 dump.rdb 文件。
redis-sentinel
该工具提供 Redis 实例的监控管理、通知和实例失效备援服务,是 Redis 集群的管理工具,监控各个其他节点的工作情况并且进行故障恢复,来提高集群的高可用性。
数据 "导出、导入、还原"
迁移 redis 数据一般有三种方式:
- 第三方工具 redis-dump、redis-load
- aof 机制,需要开启 aof 功能
- rdb 存储机制
这里使用 redis-dump 导出数据,再通过 redis-load 导入,安装 redis-dump 需要依赖 ruby,且版本大于2.2.2
添加 aliyun 镜像并检测 Ruby 版本
# gem sources -a http://mirrors.aliyun.com/rubygems/
# gem sources --remove https://rubygems.org/ #移除自带的国外源
# gem sources -l #查看源,只保留阿里云的源
*** CURRENT SOURCES ***
http://mirrors.aliyun.com/rubygems/
安装 RAM,通过 RAM 可以轻松安装、管理 Ruby 版本
# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
# curl -sSL https://get.rvm.io | bash -s stable
# source /etc/profile.d/rvm.sh #更新配置文件,使其立马生效
# rvm -v #查看RVM版本信息,如果可以代表安装成功
rvm 1.29.10 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
安装 ruby
# rvm list known #查看ruby版本
......
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.9]
[ruby-]2.5[.7]
[ruby-]2.6[.5]
[ruby-]2.7[.0]
ruby-head
......
# rvm install 2.6 #安装ruby,只要选择一个高于2.2.2版本的即可
# ruby -v #安装完成,验证ruby版本
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
安装 redis-dump
# gem install redis-dump -V
# ll /usr/local/rvm/gems/ruby-2.6.5/bin/ #安装完成后会在该目录生成三个redis相关的命令
总用量 16
-rwxr-xr-x 1 root rvm 567 6月 10 12:32 redis-dump
-rwxr-xr-x 1 root rvm 567 6月 10 12:32 redis-load
-rwxr-xr-x 1 root rvm 571 6月 10 12:32 redis-report
-rwxrwxr-x 1 root rvm 644 6月 10 12:32 ruby_executable_hooks
数据 导入、导出
使用redis-dump导出数据,导出格式为json格式 注意换成自己的密码,如果没有密码就去掉
# redis-dump -u:yourpassword@127.0.0.1:6380 > /tmp/redis-mv.json
使用redis-load导入数据 注意换成自己的密码,如果没有密码就去掉
# cat /tmp/redis-mv.json |redis-load -u :yourpassword@127.0.0.1:6383
到这数据迁移就完了,去导入的 redis 查看验证即可
2、Redis 官方文档
Redis 英文官网:https://redis.io/
github:https://github.com/redis/redis
Redis 中文官网:
- http://www.redis.cn/
- http://www.redis.net.cn/
Redis 菜鸟教程:http://www.runoob.com/redis/redis-tutorial.html
Redis 设计与实现:http://redisbook.com/
Redis基础、高级特性与性能调优:https://www.jianshu.com/p/2f14bc570563
Redis 使用
- Redis命令 redis完整的命令列表,以及他们的说明文档。
- 管道(Pipelining):学习如何一次发送多个命令,节省往返时间。
- Redis 发布/订阅(Pub/Sub):redis是一个快速、稳定的发布/订阅的信息系统。
- Redis Lua 脚本:Redis 2.6 Lua 脚本相关文档。
- Lua 脚本调试:Redis 3.2 Lua 脚本调试相关文档。
- 内存优化:了解如何使用内存和学习一些使用技巧。
- 过期(Expires):Redis允许为每一个key设置不同的过期时间,当它们到期时将自动从服务器上删除。
- 将Redis当做使用LRU算法的缓存来使用:如何配置并且将Redis当做缓存来使用,通过限制内存及自动回收键。
- Redis 事务:将一组命令放在同一个事务中进行处理。
- 大量插入数据:如何在短时间里向Redis写入大量数据。
- 从文件中批量插入数据:将文件中的指令批量执行。
- 分区(Partitioning):如何将你的数据分布在多个Redis里面。
- 分布式锁(Distributed locks):用Redis实现分布式锁管理器。
- key事件通知(Redis keyspace notifications):通过发布/订阅获得key事件的通知(版本2.8或更高)。
- 创建二级索引(Creating secondary indexes with Redis):使用redis的数据结构创建二级索引。
Redis modules API
- Introduction to Redis modules. A good place to start learing about Redis 4.0 modules programming.
- Implementing native data types. Modules scan implement new data types (data structures and more) that look like built-in data types. This documentation covers the API to do so.
- Blocking operations with modules. This is still an experimental API, but a very powerful one to write commands that can block the client (without blocking Redis) and can execute tasks in other threads.
- Redis modules API reference. Directly generated from the top comments in the source code inside
src/module.c
. Contains many low level details about API usage.
Redis 管理
- Redis-Cli:学习怎么通过命令行使用redis。
- 配置(Configuration):怎么配置 redis。
- 复制(Replication):你需要知道怎么设置主从复制。
- 持久化(Persistence):了解如何配置redis的持久化。
- Redis 管理(Redis Administration):学习redis管理方面的知识。
- 安全性(Security):概述Redis的安全。
- 加密(encryption):如何加密redis的客户端与服务端通信。。
- 信号处理(Signals Handling):如何处理Redis信号。
- 连接处理(Connections Handling):如何处理Redis客户端连接。
- 高可用性(High Availability):Redis Sentinel是Redis官方的高可用性解决方案。目前工作进展情况(beta阶段,积极发展),已经可用。
- 延迟监控(Latency monitoring):redis集成的延迟监控和报告功能对于为低延迟应用场景优化redis很有帮助。
- 基准(Benchmarks):看看Redis在不同平台上跑得有多快。
- Redis Releases:Redis的开发周期和版本编号。
Embedded and IoT
- Redis on ARM and Raspberry Pi:Starting with Redis 4.0 ARM and the Raspberry Pi are officially supported platforms. This page contains general information and benchmarks.
Redis Cluster
- Redis 集群教程:入门级的Redis集群使用指南。
- Redis 集群规范:进阶版的Redis集群使用规范。
教程 & FAQ
- FAQ:关于Redis的一些常见问题。
- 数据类型(Data types):Redis支持不同类型值的摘要。
- Redis Stream(streams)介绍:详细介绍Redis5的一种新的数据类型stream。
- 15分钟快速了解Redis的数据结构
- 用PHP+Redis编写一个简单的Twitter
- 用Redis实现自动完成
3、redis 命令 总结
官网命令 ( 英文最新版 ) :https://redis.io/commands/
安装 Redis 服务器,会自动地一起安装 Redis 命令行客户端程序。在本机输入redis-cli 命令就可以启动,客户端程序访问 Redis 服务器。
Redis 键(key) 命令
命令 | 描述 |
---|---|
Redis Type 命令 | 返回 key 所储存的值的类型。 |
Redis PEXPIREAT 命令 | 设置 key 的过期时间亿以毫秒计。 |
Redis PEXPIREAT 命令 | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
Redis Rename 命令 | 修改 key 的名称 |
Redis PERSIST 命令 | 移除 key 的过期时间,key 将持久保持。 |
Redis Move 命令 | 将当前数据库的 key 移动到给定的数据库 db 当中。 |
Redis RANDOMKEY 命令 | 从当前数据库中随机返回一个 key 。 |
Redis Dump 命令 | 序列化给定 key ,并返回被序列化的值。 |
Redis TTL 命令 | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
Redis Expire 命令 | seconds 为给定 key 设置过期时间。 |
Redis DEL 命令 | 该命令用于在 key 存在是删除 key。 |
Redis Pttl 命令 | 以毫秒为单位返回 key 的剩余的过期时间。 |
Redis Renamenx 命令 | 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
Redis EXISTS 命令 | 检查给定 key 是否存在。 |
Redis Expireat 命令 | EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
Redis Keys 命令 | 查找所有符合给定模式( pattern)的 key 。 |
Redis 字符串(String) 命令
命令 | 描述 |
---|---|
Redis Setnx 命令 | 只有在 key 不存在时设置 key 的值。 |
Redis Getrange 命令 | 返回 key 中字符串值的子字符 |
Redis Mset 命令 | 同时设置一个或多个 key-value 对。 |
Redis Setex 命令 | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
Redis SET 命令 | 设置指定 key 的值 |
Redis Get 命令 | 获取指定 key 的值。 |
Redis Getbit 命令 | 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
Redis Setbit 命令 | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
Redis Decr 命令 | 将 key 中储存的数字值减一。 |
Redis Decrby 命令 | key 所储存的值减去给定的减量值(decrement) 。 |
Redis Strlen 命令 | 返回 key 所储存的字符串值的长度。 |
Redis Msetnx 命令 | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
Redis Incrby 命令 | 将 key 所储存的值加上给定的增量值(increment) 。 |
Redis Incrbyfloat 命令 | 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
Redis Setrange 命令 | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
Redis Psetex 命令 | 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
Redis Append 命令 | 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 |
Redis Getset 命令 | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
Redis Mget 命令 | 获取所有(一个或多个)给定 key 的值。 |
Redis Incr 命令 | 将 key 中储存的数字值增一。 |
Redis 哈希(Hash) 命令
命令 | 描述 |
---|---|
Redis Hmset 命令 | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
Redis Hmget 命令 | 获取所有给定字段的值 |
Redis Hset 命令 | 将哈希表 key 中的字段 field 的值设为 value 。 |
Redis Hgetall 命令 | 获取在哈希表中指定 key 的所有字段和值 |
Redis Hget 命令 | 获取存储在哈希表中指定字段的值/td> |
Redis Hexists 命令 | 查看哈希表 key 中,指定的字段是否存在。 |
Redis Hincrby 命令 | 为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
Redis Hlen 命令 | 获取哈希表中字段的数量 |
Redis Hdel 命令 | 删除一个或多个哈希表字段 |
Redis Hvals 命令 | 获取哈希表中所有值 |
Redis Hincrbyfloat 命令 | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
Redis Hkeys 命令 | 获取所有哈希表中的字段 |
Redis Hsetnx 命令 | 只有在字段 field 不存在时,设置哈希表字段的值。 |
Redis 列表(List) 命令
命令 | 描述 |
---|---|
Redis Lindex 命令 | 通过索引获取列表中的元素 |
Redis Rpush 命令 | 在列表中添加一个或多个值 |
Redis Lrange 命令 | 获取列表指定范围内的元素 |
Redis Rpoplpush 命令 | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
Redis Blpop 命令 | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
Redis Brpop 命令 | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
Redis Brpoplpush 命令 | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
Redis Lrem 命令 | 移除列表元素 |
Redis Llen 命令 | 获取列表长度 |
Redis Ltrim 命令 | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
Redis Lpop 命令 | 移出并获取列表的第一个元素 |
Redis Lpushx 命令 | 将一个或多个值插入到已存在的列表头部 |
Redis Linsert 命令 | 在列表的元素前或者后插入元素 |
Redis Rpop 命令 | 移除并获取列表最后一个元素 |
Redis Lset 命令 | 通过索引设置列表元素的值 |
Redis Lpush 命令 | 将一个或多个值插入到列表头部 |
Redis Rpushx 命令 | 为已存在的列表添加值 |
Redis 集合(Set) 命令
命令 | 描述 |
---|---|
Redis Sunion 命令 | 返回所有给定集合的并集 |
Redis Scard 命令 | 获取集合的成员数 |
Redis Srandmember 命令 | 返回集合中一个或多个随机数 |
Redis Smembers 命令 | 返回集合中的所有成员 |
Redis Sinter 命令 | 返回给定所有集合的交集 |
Redis Srem 命令 | 移除集合中一个或多个成员 |
Redis Smove 命令 | 将 member 元素从 source 集合移动到 destination 集合 |
Redis Sadd 命令 | 向集合添加一个或多个成员 |
Redis Sismember 命令 | 判断 member 元素是否是集合 key 的成员 |
Redis Sdiffstore 命令 | 返回给定所有集合的差集并存储在 destination 中 |
Redis Sdiff 命令 | 返回给定所有集合的差集 |
Redis Sscan 命令 | 迭代集合中的元素 |
Redis Sinterstore 命令 | 返回给定所有集合的交集并存储在 destination 中 |
Redis Sunionstore 命令 | 所有给定集合的并集存储在 destination 集合中 |
Redis Spop 命令 | 移除并返回集合中的一个随机元素 |
Redis 有序集合(sorted set) 命令
命令 | 描述 |
---|---|
Redis Zrevrank 命令 | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
Redis Zlexcount 命令 | 在有序集合中计算指定字典区间内成员数量 |
Redis Zunionstore 命令 | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
Redis Zremrangebyrank 命令 | 移除有序集合中给定的排名区间的所有成员 |
Redis Zcard 命令 | 获取有序集合的成员数 |
Redis Zrem 命令 | 移除有序集合中的一个或多个成员 |
Redis Zinterstore 命令 | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
Redis Zrank 命令 | 返回有序集合中指定成员的索引 |
Redis Zincrby 命令 | 有序集合中对指定成员的分数加上增量 increment |
Redis Zrangebyscore 命令 | 通过分数返回有序集合指定区间内的成员 |
Redis Zrangebylex 命令 | 通过字典区间返回有序集合的成员 |
Redis Zscore 命令 | 返回有序集中,成员的分数值 |
Redis Zremrangebyscore 命令 | 移除有序集合中给定的分数区间的所有成员 |
Redis Zscan 命令 | 迭代有序集合中的元素(包括元素成员和元素分值) |
Redis Zrevrangebyscore 命令 | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
Redis Zremrangebylex 命令 | 移除有序集合中给定的字典区间的所有成员 |
Redis Zrevrange 命令 | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
Redis Zrange 命令 | 通过索引区间返回有序集合成指定区间内的成员 |
Redis Zcount 命令 | 计算在有序集合中指定区间分数的成员数 |
Redis Zadd 命令 | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
Redis 连接 命令
命令 | 描述 |
---|---|
Redis Echo 命令 | 打印字符串 |
Redis Select 命令 | 切换到指定的数据库 |
Redis Ping 命令 | 查看服务是否运行 |
Redis Quit 命令 | 关闭当前连接 |
Redis Auth 命令 | 验证密码是否正确 |
Redis 服务器 命令
Redis 脚本 命令
命令 | 描述 |
---|---|
Redis Script kill 命令 | 杀死当前正在运行的 Lua 脚本。 |
Redis Script Load 命令 | 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。 |
Redis Eval 命令 | 执行 Lua 脚本。 |
Redis Evalsha 命令 | 执行 Lua 脚本。 |
Redis Script Exists 命令 | 查看指定的脚本是否已经被保存在缓存当中。 |
Redis Script Flush 命令 | 从脚本缓存中移除所有脚本。 |
Redis 事务 命令
命令 | 描述 |
---|---|
Redis Exec 命令 | 执行所有事务块内的命令。 |
Redis Watch 命令 | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
Redis Discard 命令 | 取消事务,放弃执行事务块内的所有命令。 |
Redis Unwatch 命令 | 取消 WATCH 命令对所有 key 的监视。 |
Redis Multi 命令 | 标记一个事务块的开始。 |
Redis HyperLogLog 命令
命令 | 描述 |
---|---|
Redis Pgmerge 命令 | 将多个 HyperLogLog 合并为一个 HyperLogLog |
Redis Pfadd 命令 | 添加指定元素到 HyperLogLog 中。 |
Redis Pfcount 命令 | 返回给定 HyperLogLog 的基数估算值。 |
Redis 发布订阅 命令
命令 | 描述 |
---|---|
Redis Unsubscribe 命令 | 指退订给定的频道。 |
Redis Subscribe 命令 | 订阅给定的一个或多个频道的信息。 |
Redis Pubsub 命令 | 查看订阅与发布系统状态。 |
Redis Punsubscribe 命令 | 退订所有给定模式的频道。 |
Redis Publish 命令 | 将信息发送到指定的频道。 |
Redis Psubscribe 命令 | 订阅一个或多个符合给定模式的频道。 |
Redis 地理位置(geo) 命令
命令 | 描述 |
---|---|
Redis GEOHASH 命令 | 返回一个或多个位置元素的 Geohash 表示 |
Redis GEOPOS 命令 | 从key里返回所有给定位置元素的位置(经度和纬度) |
Redis GEODIST 命令 | 返回两个给定位置之间的距离 |
Redis GEORADIUS 命令 | 以给定的经纬度为中心, 找出某一半径内的元素 |
Redis GEOADD 命令 | 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中 |
Redis GEORADIUSBYMEMBER 命令 | 找出位于指定范围内的元素,中心点是由给定的位置元素决定 |
4、redis 数据类型(Data Types)
官网文档:https://redis.io/docs/data-types/
字符串(Strings)
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。
一个字符串类型的值最多能存储512M字节的内容。
你可以用Redis字符串做许多有趣的事,例如你可以:
- 利用INCR命令簇(INCR, DECR, INCRBY)来把字符串当作原子计数器使用。
- 使用APPEND命令在字符串后添加内容。
- 将字符串作为GETRANGE 和 SETRANGE的随机访问向量。
- 在小空间里编码大量数据,或者使用 GETBIT 和 SETBIT创建一个Redis支持的Bloom过滤器。
查看所有可用的字符串命令获取更多信息, 或者进一步阅读 Redis数据类型介绍.
列表(Lists)
Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
LPUSH 命令插入一个新元素到列表头部,而RPUSH命令 插入一个新元素到列表的尾部。当 对一个空key执行其中某个命令时,将会创建一个新表。 类似的,如果一个操作要清空列表,那么key会从对应的key空间删除。这是个非常便利的语义, 因为如果使用一个不存在的key作为参数,所有的列表命令都会像在对一个空表操作一样。
一些列表操作及其结果:
LPUSH mylist a # now the list is "a"
LPUSH mylist b # now the list is "b","a"
RPUSH mylist c # now the list is "b","a","c" (RPUSH was used this time)
一个列表最多可以包含232-1个元素(4294967295,每个表超过40亿个元素)。
从时间复杂度的角度来看,Redis列表主要的特性就是支持时间常数的 插入和靠近头尾部元素的删除,即使是需要插入上百万的条目。 访问列表两端的元素是非常快的,但如果你试着访问一个非常大 的列表的中间元素仍然是十分慢的,因为那是一个时间复杂度为 O(N) 的操作。
你可以用Redis列表做许多有趣的事,例如你可以:
- 在社交网络中建立一个时间线模型,使用LPUSH去添加新的元素到用户时间线中,使用LRANGE去检索一些最近插入的条目。
- 你可以同时使用LPUSH和LTRIM去创建一个永远不会超过指定元素数目的列表并同时记住最后的N个元素。
- 列表可以用来当作消息传递的基元(primitive),例如,众所周知的用来创建后台任务的Resque Ruby库。
- 你可以使用列表做更多事,这个数据类型支持许多命令,包括像BLPOP这样的阻塞命令。请查看所有可用的列表操作命令获取更多的信息。
查看完整的 列表(Lists) 获取更多信息, 或者进一步阅读 Redis数据类型介绍.
集合(Sets)
Redis集合是一个无序的字符串合集。你可以以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。
Redis集合有着不允许相同成员存在的优秀特性。向集合中多次添加同一元素,在集合中最终只会存在一个此元素。实际上这就意味着,在添加元素前,你并不需要事先进行检验此元素是否已经存在的操作。
一个Redis列表十分有趣的事是,它们支持一些服务端的命令从现有的集合出发去进行集合运算。 所以你可以在很短的时间内完成合并(union),求交(intersection), 找出不同元素的操作。
一个集合最多可以包含232-1个元素(4294967295,每个集合超过40亿个元素)。
你可以用Redis集合做很多有趣的事,例如你可以:
- 用集合跟踪一个独特的事。想要知道所有访问某个博客文章的独立IP?只要每次都用SADD来处理一个页面访问。那么你可以肯定重复的IP是不会插入的。
- Redis集合能很好的表示关系。你可以创建一个tagging系统,然后用集合来代表单个tag。接下来你可以用SADD命令把所有拥有tag的对象的所有ID添加进集合,这样来表示这个特定的tag。如果你想要同时有3个不同tag的所有对象的所有ID,那么你需要使用SINTER.
- 使用SPOP或者SRANDMEMBER命令随机地获取元素。
- 查看完整的 集合(Sets) 获取更多信息, 或者进一步阅读 Redis数据类型介绍.
哈希(Hashes)
Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象(eg:一个有名,姓,年龄等属性的用户)的数据类型。
@cli
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000
一个拥有少量(100个左右)字段的hash需要 很少的空间来存储,所有你可以在一个小型的 Redis实例中存储上百万的对象。
尽管Hashes主要用来表示对象,但它们也能够存储许多元素,所以你也可以用Hashes来完成许多其他的任务。
一个hash最多可以包含232-1 个key-value键值对(超过40亿)。
查看完整的 哈希(Hashes) 获取更多信息, 或者进一步阅读 Redis数据类型介绍.
有序集合(Sorted sets)
Redis有序集合和Redis集合类似,是不包含 相同字符串的合集。它们的差别是,每个有序集合 的成员都关联着一个评分,这个评分用于把有序集 合中的成员按最低分到最高分排列。
使用有序集合,你可以非常快地(O(log(N)))完成添加,删除和更新元素的操作。 因为元素是在插入时就排好序的,所以很快地通过评分(score)或者 位次(position)获得一个范围的元素。 访问有序集合的中间元素同样也是非常快的,因此你可以使用有序集合作为一个没用重复成员的智能列表。 在这个列表中, 你可以轻易地访问任何你需要的东西: 有序的元素,快速的存在性测试,快速访问集合中间元素!
简而言之,使用有序集合你可以很好地完成 很多在其他数据库中难以实现的任务。
使用有序集合你可以:
- 在一个巨型在线游戏中建立一个排行榜,每当有新的记录产生时,使用ZADD 来更新它。你可以用ZRANGE轻松地获取排名靠前的用户, 你也可以提供一个用户名,然后用ZRANK获取他在排行榜中的名次。 同时使用ZRANK和ZRANGE你可以获得与指定用户有相同分数的用户名单。 所有这些操作都非常迅速。
- 有序集合通常用来索引存储在Redis中的数据。 例如:如果你有很多的hash来表示用户,那么你可以使用一个有序集合,这个集合的年龄字段用来当作评分,用户ID当作值。用ZRANGEBYSCORE可以简单快速地检索到给定年龄段的所有用户。
- 有序集合或许是最高级的Redis数据类型,所以花些时间查看完整的有序集合(Sorted sets)命令列表去探索你能用Redis干些什么吧!
Bitmaps 和 HyperLogLogs
Redis 同样支持 Bitmaps 和 HyperLogLogs 数据类型,实际上是基于字符串的基本类型的数据类型,但有自己的语义。
查看详细Redis数据类型介绍.
5、Redis 持久化 详解
Redis 提供了两种持久化的方式:
- RDB(Redis DataBase)
- AOF(Append Only File)。
详细
- 英文:https://redis.io/docs/management/persistence/
- 中文:http://www.redis.cn/topics/persistence.html
6、虚拟内存介绍
简介
和大多NoSQL数据库一样,Redis同样遵循了Key/Value数据存储模型。在有些情况下,Redis会将Keys/Values保存在内存中以提高数据查询和数据修改的效率,然而这样的做法并非总是很好的选择。鉴于此,我们可以将之进一步优化,即尽量在内存中只保留Keys的数据,这样可以保证数据检索的效率,而Values数据在很少使用的时候则可以被换出到磁盘。
在实际的应用中,大约只有10%的Keys属于相对比较常用的键,这样Redis就可以通过虚存将其余不常用的Keys和Values换出到磁盘上,而一旦这些被换出的Keys或Values需要被读取时,Redis则将其再次读回到主内存中。
应用场景
对于大多数数据库而言,最为理想的运行方式就是将所有的数据都加载到内存中,而之后的查询操作则可以完全基于内存数据完成。然而在现实中这样的场景却并不普遍,更多的情况则是只有部分数据可以被加载到内存中。
在Redis中,有一个非常重要的概念,即keys一般不会被交换,所以如果你的数据库中有大量的keys,其中每个key仅仅关联很小的value,那么这种场景就不是非常适合使用虚拟内存。如果恰恰相反,数据库中只是包含少量的keys,而每一个key所关联的value却非常大,那么这种场景对于使用虚存就再合适不过了。
在实际的应用中,为了能让虚存更为充分的发挥作用以帮助我们提高系统的运行效率,我们可以将带有很多较小值的Keys合并为带有少量较大值的Keys。其中最主要的方法就是将原有的Key/Value模式改为基于Hash的模式,这样可以让很多原来的Keys成为Hash中的属性。
配置
1). 在配置文件中添加以下配置项,以使当前Redis服务器在启动时打开虚存功能。
vm-enabled yes
2). 在配置文件中设定Redis最大可用的虚存字节数。如果内存中的数据大于该值,则有部分对象被换出到磁盘中,其中被换出对象所占用内存将被释放,直到已用内存小于该值时才停止换出。
vm-max-memory (bytes)
Redis的交换规则是尽量考虑"最老"的数据,即最长时间没有使用的数据将被换出。如果两个对象的age相同,那么Value较大的数据将先被换出。需要注意的是,Redis不会将Keys交换到磁盘,因此如果仅仅keys的数据就已经填满了整个虚存,那么这种数据模型将不适合使用虚存机制,或者是将该值设置的更大,以容纳整个Keys的数据。在实际的应用,如果考虑使用Redis虚拟内存,我们应尽可能的分配更多的内存交给Redis使用,以避免频繁的换入换出。
3). 在配置文件中设定页的数量及每一页所占用的字节数。为了将内存中的数据传送到磁盘上,我们需要使用交换文件。这些文件与数据持久性无关,Redis会在退出前会将它们全部删除。由于对交换文件的访问方式大多为随机访问,因此建议将交换文件存储在固态磁盘上,这样可以大大提高系统的运行效率。
vm-pages 134217728
vm-page-size 32
在上面的配置中,Redis将交换文件划分为vm-pages个页,其中每个页所占用的字节为vm-page-size,那么Redis最终可用的交换文件大小为:vm-pages * vm-page-size。由于一个value可以存放在一个或多个页上,但是一个页不能持有多个value,鉴于此,我们在设置vm-page-size时需要充分考虑Redis的该特征。
4). 在Redis的配置文件中有一个非常重要的配置参数,即:
vm-max-threads 4
该参数表示Redis在对交换文件执行IO操作时所应用的最大线程数量。通常而言,我们推荐该值等于主机的CPU cores。如果将该值设置为0,那么Redis在与交换文件进行IO交互时,将以同步的方式执行此操作。
对于Redis而言,如果操作交换文件是以同步的方式进行,那么当某一客户端正在访问交换文件中的数据时,其它客户端如果再试图访问交换文件中的数据,该客户端的请求就将被挂起,直到之前的操作结束为止。特别是在相对较慢或较忙的磁盘上读取较大的数据值时,这种阻塞所带来的影响就更为突兀了。然而同步操作也并非一无是处,事实上,从全局执行效率视角来看,同步方式要好于异步方式,毕竟同步方式节省了线程切换、线程间同步,以及线程拉起等操作产生的额外开销。特别是当大部分频繁使用的数据都可以直接从主内存中读取时,同步方式的表现将更为优异。
如果你的现实应用恰恰相反,即有大量的换入换出操作,同时你的系统又有很多的cores,有鉴于此,你又不希望客户端在访问交换文件之前不得不阻塞一小段时间,如果确实是这样,我想异步方式可能更适合于你的系统。
至于最终选用哪种配置方式,最好的答案将来自于不断的实验和调优。
7、Redis 高可用 ( 主从、哨兵、集群 )
:https://blog.csdn.net/qq_26012495/article/details/120299332
单节点 模式。Redis默认启动,什么都不配置,默认就是Master节点,简单却不具备高可用。
- 优点:配置简单,操作简单
- 缺点:单点的宕机引来的服务的灾难、数据丢失。单点服务器内存瓶颈,无法无限纵向扩容
- 解决办法:单节点宕机,可以由其他节点暂时顶替,宕机的慢慢排查
主从 模式
- 优点:有了主从,提高了Redis整体的可用性,当主节点(master)挂了,可以把从节点(slave)手动升级为主节点继续服务。
- 缺点:master挂了整个Redis将失去写操作的能力,仅具备读操作,需要运维半夜爬起来手动升级,中间的请求失败数据丢失无法容忍。
- 解决办法:可以有一种方式自动升级slave为master ------【哨兵】
哨兵模式:用于解决主从模式中无法自动升级主节点的问题,一个哨兵是一个节点,用于监控主从节点的健康,当主节点挂掉的时候,自动选择一个最优从节点升级为主节点。
但哨兵如果挂了怎么办?于是哨兵一般都会是一个集群,是集群高可用的心脏,一般由3-5个节点组成,即使个别节点挂了,集群还可以正常运行。
- 优点:可以在master挂掉后自动选举新的master
- 缺点:master 挂了,切换新的master会造成未来得及主从同步的数据丢失。大数据高并发,单个master内存仍存在上限。主从全量同步仍然要耗费大量时间。单个Redis只能利用CPU的单个核心,应对海量数据捉襟见肘
- 解决办法:Redis集群方案
集群 模式
优点
无中心架构,支持动态扩容
Cluster自动具备哨兵监控和故障转移(主从切换)能力
客户端连接集群内部地址可自动发现
高性能、高可用,有效解决了Redis分布式需求
缺点
运维复杂
只能使用0号数据库
Sentinel 节点为什么是至少三个且奇数个?
首先必须是集群,所以不能是1个。而选举过程要大多数同意才行(即最少一半+1个),而奇数个节点在同样选举条件上可以节省一台机器。
比如一共5台,有3台同意了就行;而4台,大多数同意也要3台。
Redis 集群节点数为什么至少是6个?
6个包含一主一从,如果每个节点一主二从则需要9个
最少3个节点,是因为容错能力相同情况下,奇数节点更节省资源(3个节点的集群允许一个节点宕机;而4个节点的集群也允许一个节点宕机)
为什么 Redis Cluster 槽位设计成 16384 个?
2^14=16384,当槽位再扩就是32768、65536,此时每一次ping都要将槽位作为心跳包,信息太大,占用带宽
由于集群节点越多,心跳包携带的数据就越多。当节点超过1000,会导致网络拥堵。因此Redis作者不建议Redis Cluster节点数量超过1000,那么16384槽位也足够用
8、redis 的 事务处理
redis 事务
:https://redis.io/docs/manual/transactions/
:https://www.redis.net.cn/tutorial/3515.html
:http://www.redis.cn/topics/transactions.html
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
9、redis 配置
:https://redis.io/docs/management/config/
- 快照,主要涉及的是redis的RDB持久化相关的配置,
- 复制。redis提供了主从同步功能。通过 slaveof 配置项可以控制某一个redis作为另一个redis的从服务器,通过指定IP和端口来定位到主redis的位置。一般情况下,我们会建议用户为从redis设置一个不同频率的快照持久化的周期,或者为从redis配置一个不同的服务端口等等。
- 安全。可以要求redis客户端在向redis-server发送请求之前,先进行密码验证。当你的redis-server处于一个不太可信的网络环境中时,相信你会用上这个功能。由于redis性能非常高,所以每秒钟可以完成多达15万次的密码尝试,所以你最好设置一个足够复杂的密码,否则很容易被黑客破解。
- 限制。可以设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。当你无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自身内部处理逻辑留一些句柄出来。
- 追加模式。默认情况下,redis会异步的将数据持久化到磁盘。这种模式在大部分应用程序中已被验证是很有效的,但是在一些问题发生时,比如断电,则这种机制可能会导致数分钟的写请求丢失。如博文上半部分中介绍的,追加文件(Append Only File)是一种更好的保持数据一致性的方式。即使当服务器断电时,也仅会有1秒钟的写请求丢失,当redis进程出现问题且操作系统运行正常时,甚至只会丢失一条写请求。建议大家,AOF机制和RDB机制可以同时使用,不会有任何冲突。对于如何保持数据一致性的讨论,请参见:https://redis.io/docs/management/persistence/
- LUA脚本。lua脚本的最大运行时间是需要被严格限制的,要注意单位是毫秒:lua-time-limit 5000 如果此值设置为0或负数,则既不会有报错也不会有时间限制。
- 慢日志。redis慢日志是指一个系统进行日志查询超过了指定的时长。这个时长不包括IO操作,比如与客户端的交互、发送响应内容等,而仅包括实际执行查询命令的时间。针对慢日志,你可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。单位是微秒,即1000000表示一秒。负数则会禁用慢日志功能,而0则表示强制记录每一个命令:slowlog-log-slower-than 10000 慢日志最大长度,可以随便填写数值,没有上限,但要注意它会消耗内存。你可以使用SLOWLOG RESET来重设这个值:slowlog-max-len 128
- 事件通知。redis可以向客户端通知某些事件的发生。这个特性的具体解释可以参见:https://redis.io/topics/keyspace-events
- 高级配置
有关哈希数据结构的一些配置项:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
有关列表数据结构的一些配置项:
list-max-ziplist-entries 512
list-max-ziplist-value 64
有关集合数据结构的配置项:
set-max-intset-entries 512
有关有序集合数据结构的配置项:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
关于是否需要再哈希的配置项:
activerehashing yes
关于客户端输出缓冲的控制项:
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
有关频率的配置项:
hz 10
有关重写aof的配置项
aof-rewrite-incremental-fsync yes