“Redis:常用命令”的版本间差异

来自Wikioe
跳到导航 跳到搜索
第57行: 第57行:
#* memcache:提供了 CAS 保证多个并发访问操作同一份数据的一致性问题;
#* memcache:提供了 CAS 保证多个并发访问操作同一份数据的一致性问题;
# '''I/O模型''':
# '''I/O模型''':
#* redis:单线程I/O复用(但支持“通道技术”);
#* redis:<s>单线程I/O复用</s> 单线程、多路I/O复用(并支持“通道技术”);
#* memcache:非阻塞I/O复用;
#* memcache:非阻塞I/O复用;【?】


简单来说,虽然二者都是 key-value 的存储服务器,但 memcache 是一个纯粹的缓存(内存缓存),而 redis 更接近一个完备的数据库(内存数据库)。
简单来说,虽然二者都是 key-value 的存储服务器,但 memcache 是一个纯粹的缓存(内存缓存),而 redis 更接近一个完备的数据库(内存数据库)。

2021年5月11日 (二) 01:24的版本


关于

Remote Dictionary Server(Redis)是一个开源的由 Salvatore Sanfilippo 使用 ANSI C 语言编写的'''key-value'''数据存储服务器。其值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型,所以它通常也被称为数据结构服务器。

Redis 本质上是一个 Key-Value 类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。


  • 因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的 Key-Value DB。
  • Redis的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外【单个 value 的最大限制是 1 GB】,不像 memcached 只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
    比方说用他的 List 来做 FIFO 双向链表,实现一个轻量级的高性 能消息队列服务,用他的 Set 可以做高性能的 tag 系统等等。【???】
  • 另外 Redis 也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一个功能加强版的 memcached 来用。


Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。

  • redis.conf”是 Redis 的配置文件;
  • redis 默认为 16 个库(默认自动使用 0 号库);

特点

redis 的特点:

  1. redis 足够简单和稳定
  2. 支持丰富的数据结构
  3. 内存存储读写性能优秀
  4. 提供持久化的支持
  5. 支持部分事务操作

关于 NoSQL

redis 属于NoSQL数据库,NoSQL 数据库叫非关系型数据库,(NoSQL = Not Only SQL),意即“不仅仅是SQL”。


按存储方式不同,数据库可以分为以下类型:

  • key-value 存储:“Berkeley DB”、“MemcacheDB”、“Redis”;【Memcache不能持久化???】
  • 文档存储:“MongoDB”、“CouchDB”;
  • 列存储:“Hbase”、“Cassandra”;

与 memcache 的区别?

二者区别主要体现在以下方面:

  1. 数据类型
    • redis:数据类型丰富,支持 set liset 等类型;
    • memcache:支持简单数据类型,需要客户端自己处理复杂对象;
  2. value大小
    • redis:单个 value 的最大限制是 1 GB;【key、string、以及集合链表哈希的单个元素,大小上限都是 512 M
    • memcache:是一个内存缓存,key 的长度小于 250 字符,单个 item 存储要小于 1M;
  3. 持久性
    • redis:支持数据落地持久化存储;
    • memcache:不支持数据持久存储(重启后数据全部丢失);
  4. 分布式存储
    • redis:支持 master-slave 复制模式;
    • memcache:可以使用一致性 hash 做分布式(无法进行数据同步);
  5. 事务
    • redis:支持事务操作;
    • memcache:只保证简单操作的原子性,不支持事务;
  6. 数据一致性不同
    • redis:使用的是单线程模型,没有 CAS 支持,使用事务保证一串命令的原子性;
    • memcache:提供了 CAS 保证多个并发访问操作同一份数据的一致性问题;
  7. I/O模型
    • redis:单线程I/O复用 单线程、多路I/O复用(并支持“通道技术”);
    • memcache:非阻塞I/O复用;【?】

简单来说,虽然二者都是 key-value 的存储服务器,但 memcache 是一个纯粹的缓存(内存缓存),而 redis 更接近一个完备的数据库(内存数据库)。

Redis命令

redis手册:

连接命令

Redis 连接命令主要是用于连接 redis 服务:

命令 描述
AUTH <password> 验证密码是否正确
ECHO <message> 打印字符串
PING 查看服务是否运行
QUIT 关闭当前连接
SELECT <index> 切换到指定的数据库

示例:

redis 127.0.0.1:6379> AUTH "password"
OK
redis 127.0.0.1:6379> PING
PONG

服务器命令

Redis 服务器命令主要是用于管理 redis 服务:

命令 描述
INFO [section] 获取 Redis 服务器的各种信息和统计数值
MONITOR 实时打印出 Redis 服务器接收到的命令,调试用
DBSIZE 返回当前数据库的 key 的数量
FLUSHALL 删除所有数据库的所有key
FLUSHDB 删除当前数据库的所有key
TIME 返回当前服务器时间
LASTSAVE 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
SAVE 同步保存数据到硬盘
BGSAVE 在后台异步保存当前数据库的数据到磁盘
BGREWRITEAOF 异步执行一个 AOF(AppendOnly File) 文件重写操作
SHUTDOWN [NOSAVE] [SAVE] 异步保存数据到硬盘,并关闭服务器
COMMAND 获取 Redis 命令详情数组
COMMAND COUNT 获取 Redis 命令总数
COMMAND GETKEYS 获取给定命令的所有键
COMMAND INFO <command-name> [<command-name>] 获取指定 Redis 命令描述的数组
CLIENT LIST 获取连接到服务器的客户端连接列表
CLIENT GETNAME 获取连接的名称
CLIENT PAUSE <timeout> 在指定时间内终止运行来自客户端的命令
CLIENT SETNAME <connection-name> 设置当前连接的名称
CLIENT KILL [ip:port] [ID client-id] 关闭客户端连接
CONFIG GET <parameter> 获取指定配置参数的值
CONFIG REWRITE 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
CONFIG SET <parameter> <value> 修改 redis 配置参数,无需重启
CONFIG RESETSTAT 重置 INFO 命令中的某些统计数据
DEBUG OBJECT <key> 获取 key 的调试信息
DEBUG SEGFAULT 让 Redis 服务崩溃【???】
SLOWLOG <subcommand> [argument] 管理 redis 的慢日志
CLUSTER SLOTS 获取集群节点的映射数组
ROLE 返回主从实例所属的角色
SLAVEOF <host> <port> 将当前服务器转变为指定服务器的从属服务器(slave server)
SYNC 用于复制功能(replication)的内部命令


以下实例演示了如何获取 redis 服务器的统计信息:

redis 127.0.0.1:6379> INFO

# Server
redis_version:2.8.13
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:c2238b38b1edb0e2
redis_mode:standalone
os:Linux 3.5.0-48-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.7.2
process_id:3856
run_id:0e61abd297771de3fe812a3c21027732ac9f41fe
tcp_port:6379
uptime_in_seconds:11554
uptime_in_days:0
hz:10
lru_clock:16651447
config_file:

# Clients
connected_clients:1
client-longest_output_list:0
client-biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:589016
used_memory_human:575.21K
used_memory_rss:2461696
used_memory_peak:667312
used_memory_peak_human:651.67K
used_memory_lua:33792
mem_fragmentation_ratio:4.18
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1409158561
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:24
total_commands_processed:294
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:41
keyspace_misses:82
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:264

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:10.49
used_cpu_user:4.96
used_cpu_sys_children:0.00
used_cpu_user_children:0.01

# Keyspace
db0:keys=94,expires=1,avg_ttl=41638810
db1:keys=1,expires=0,avg_ttl=0
db3:keys=1,expires=0,avg_ttl=0

脚本命令

Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL

Eval 命令的基本语法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]


下表列出了 redis 脚本常用命令:

命令 描述
EVAL <script> numkeys <key> [<key>] <arg> [<arg>] 执行 Lua 脚本。
EVALSHA sha1 numkeys <key> [<key>] <arg> [<arg>] 执行 Lua 脚本。【?】
SCRIPT LOAD <script> 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。
SCRIPT EXISTS <script> [<script>] 查看指定的脚本是否已经被保存在缓存当中。
SCRIPT FLUSH 从脚本缓存中移除所有脚本。
SCRIPT KILL 杀死当前正在运行的 Lua 脚本。


示例:

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"
2) "key2"
3) "first"
4) "second"

安全

以下都是在配置文件“redis.conf”中进行修改。

设置密码

通过以下命令查看是否设置了密码验证:

127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
  • 默认情况下 requirepass 参数是空的。


可以通过两种方式设置密码:

  1. 配置文件:
    requirepass 123456
    
  2. 命令:
    127.0.0.1:6379> CONFIG set requirepass "runoob"
    OK
    
  • 因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K 次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。


可以通过两种方式使用密码:

  1. 启动时:
    redis-cli -h 127.0.0.1 -p 6379 -a 123456
    
  2. 连接时:
    AUTH 123456
    

绑定ip

配置文件中:

# bind 127.0.0.1
  1. 取消 ip 绑定注释(去掉 #),
  2. 修改“127.0.0.1”为允许访问 redis 服务器的ip地址:

禁用命令、重命名命令

配置文件中:

rename-command FLUSHALL oyfekmjvmwxq5a9c8usofuo369x0it2k        # 重命名FLUSHALL命令
rename-command FLUSHALL ""                                      # 禁用FLUSHALL命令
rename-command FLUSHDB ""                                       # 禁止FLUSHDB命令
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52  # 重命名CONFIG命令
rename-command CONFIG ""                                        # 禁止CONFIG命令
  • 对于禁用“FLUSHALL”命令,需要保证“appendonly.aof”文件没有 flushall 命令,否则服务器无法启动;

修改默认端口

配置文件中:

port 6379
  • 修改 redis 的端口,这一点很重要,使用默认的端口很危险;