redis 是什么?
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-side sharding)等特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
redis 安装
macos 上的安装
brew install redis
ubuntu 上的安装
sudo apt-get install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
Redhat Centos上的安装
sudo yum install redis
sudo systemctl enable redis
sudo systemctl start redis
连接到redis
ninjamac@ip-192-168-1-2 ~ % redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
Redis常用命令介绍
1. string 的用法
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello //删除后查询结果为nil
(nil)
2. list 的用法
127.0.0.1:6379> rpush list-key item
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1 //根据范围来查看
1) "item"
2) "item2"
3) "item"
127.0.0.1:6379> lpop list-key //弹出一个元素
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"
3. 集合的用法
127.0.0.1:6379> sadd set-key item. //当你将一个元素添加到集合,成功后会返回一个1
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item
(integer) 0
127.0.0.1:6379> smembers set-key //查看集合中所有的元素
1) "item"
2) "item2"
127.0.0.1:6379> sismember set-key item4 //判断某个元素是否在集合中,不在的话返回0,在的话返回1
(integer) 0
127.0.0.1:6379> sismember set-key item
(integer) 1
127.0.0.1:6379> srem set-key item2 //从集合中删除某个元素
(integer) 1
127.0.0.1:6379> smembers set-key
1) "item"
4. 散列的用法
127.0.0.1:6379> hset hash-key sub-key1 value1. //在尝试添加键值到散列的时候会返回一个值
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
127.0.0.1:6379> hset hash-key sub-key3 value1
(integer) 1
127.0.0.1:6379> hgetall hash-key //列出散列中所有的键值对
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
5) "sub-key3"
6) "value1"
127.0.0.1:6379> hdel hash-key sub-key2 //从散列中删除简直对
(integer) 1
127.0.0.1:6379> hdel hash-key sub-key1
(integer) 1
127.0.0.1:6379> hgetall hash-key
1) "sub-key3"
2) "value1"
5. 有序集合的用法
127.0.0.1:6379> zadd zset-key 738 member1 //往集合添加一个键值对会返回一个值
(integer) 1
127.0.0.1:6379> zadd zset-key 900 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 900 member0
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores //查询集合里所有的键值对
1) "member1"
2) "738"
3) "member0"
4) "900"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores //按照范围查询键值对
1) "member1"
2) "738"
127.0.0.1:6379> zrem zset-key member1。 //删除键值对
(integer) 1
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "900"
6. 订阅和发布
有一个客户端订阅了redisChat通道
127.0.0.1:6379> SUBSCRIBE redisChat
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
另一个客户端发布消息到redisChat通道:
127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
订阅该通道的客户端可以接受该消息
127.0.0.1:6379> SUBSCRIBE redisChat
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
7. 事务的用法
redis 事务允许在一个步骤中执行一组命令。以下是事务的两个属性:
- 事务中的所有命令都作为单个隔离操作按顺序执行。Redis 事务执行过程中不可能处理其他客户端发出的请求。
- Redis 事务也是原子性的。原子性意味着要么处理所有命令,要么不处理任何命令。
Redis 事务由命令 MULTI 启动,然后您需要传递一个应在事务中执行的命令列表,之后由 EXEC 命令执行整个事务。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SET tutorial redis
QUEUED
127.0.0.1:6379(TX)> GET turorial
QUEUED
127.0.0.1:6379(TX)> INCR visitors
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (nil)
3) (integer) 1
8. redis - server
Redis 服务器命令主要用于管理 Redis 服务器。
示例
以下示例解释了如何获取服务器的所有统计信息。
127.0.0.1:6379> INFO
# Server
redis_version:7.2.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7f24f11dd7e42c58
redis_mode:standalone
os:Darwin 24.3.0 arm64
arch_bits:64
monotonic_clock:POSIX clock_gettime
multiplexing_api:kqueue
atomicvar_api:c11-builtin
gcc_version:4.2.1
process_id:7521
process_supervised:no
run_id:3128aefc390caa8d8b5900f48760227b60bab3b0
tcp_port:6379
server_time_usec:1745481054943667
uptime_in_seconds:14771
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:650590
executable:/Users/ninjamac/redis-server
config_file:
io_threads_active:0
listener0:name=tcp,bind=*,bind=-::*,port=6379# Clients
connected_clients:2
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:16
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0
total_blocking_keys:0
total_blocking_keys_on_nokey:0# Memory
used_memory:1716192
used_memory_human:1.64M
used_memory_rss:1572864
used_memory_rss_human:1.50M
used_memory_peak:1833280
used_memory_peak_human:1.75M
used_memory_peak_perc:93.61%
used_memory_overhead:1102904
used_memory_startup:1098848
used_memory_dataset:613288
used_memory_dataset_perc:99.34%
allocator_allocated:1696496
allocator_active:1541120
allocator_resident:1541120
total_system_memory:8589934592
total_system_memory_human:8.00G
used_memory_lua:31744
used_memory_vm_eval:31744
used_memory_lua_human:31.00K
used_memory_scripts_eval:0
number_of_cached_scripts:0
number_of_functions:0
number_of_libraries:0
used_memory_vm_functions:32768
used_memory_vm_total:64512
used_memory_vm_total_human:63.00K
used_memory_functions:216
used_memory_scripts:216
used_memory_scripts_human:216B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:0.91
allocator_frag_bytes:18446744073709396240
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.02
rss_overhead_bytes:31744
mem_fragmentation_ratio:0.93
mem_fragmentation_bytes:-123632
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_total_replication_buffers:0
mem_clients_slaves:0
mem_clients_normal:3648
mem_cluster_links:0
mem_aof_buffer:0
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0# Persistence
loading:0
async_loading:0
current_cow_peak:0
current_cow_size:0
current_cow_size_age:0
current_fork_perc:0.00
current_save_keys_processed:0
current_save_keys_total:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1745480666
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_saves:2
rdb_last_cow_size:0
rdb_last_load_keys_expired:0
rdb_last_load_keys_loaded:0
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_rewrites:0
aof_rewrites_consecutive_failures:0
aof_last_write_status:ok
aof_last_cow_size:0
module_fork_in_progress:0
module_fork_last_cow_size:0# Stats
total_connections_received:3
total_commands_processed:47
instantaneous_ops_per_sec:0
total_net_input_bytes:1888
total_net_output_bytes:411128
total_net_repl_input_bytes:0
total_net_repl_output_bytes:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
instantaneous_input_repl_kbps:0.00
instantaneous_output_repl_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
expire_cycle_cpu_milliseconds:408
evicted_keys:0
evicted_clients:0
total_eviction_exceeded_time:0
current_eviction_exceeded_time:0
keyspace_hits:13
keyspace_misses:3
pubsub_channels:0
pubsub_patterns:0
pubsubshard_channels:0
latest_fork_usec:472
total_forks:2
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
total_active_defrag_time:0
current_active_defrag_time:0
tracking_total_keys:0
tracking_total_items:0
tracking_total_prefixes:0
unexpected_error_replies:0
total_error_replies:1
dump_payload_sanitizations:0
total_reads_processed:50
total_writes_processed:55
io_threaded_reads_processed:0
io_threaded_writes_processed:0
reply_buffer_shrinks:3
reply_buffer_expands:0
eventloop_cycles:145460
eventloop_duration_sum:15705009
eventloop_duration_cmd_sum:11215
instantaneous_eventloop_cycles_per_sec:9
instantaneous_eventloop_duration_usec:58
acl_access_denied_auth:0
acl_access_denied_cmd:0
acl_access_denied_key:0
acl_access_denied_channel:0# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:6824c9d2b58f349f1b5e416a534b7cf7e569958b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0# CPU
used_cpu_sys:10.848199
used_cpu_user:7.186347
used_cpu_sys_children:0.004874
used_cpu_user_children:0.000463# Modules# Errorstats
errorstat_ERR:count=1# Cluster
cluster_enabled:0# Keyspace
db0:keys=4,expires=0,avg_ttl=0
9. redis script
Redis 脚本用于使用 Lua 解释器执行脚本。从 2.6.0 版本开始,它内置于 Redis 中。用于脚本编写的命令是 EVAL 命令。
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"
10. redis 备份和安全
127.0.0.1:6379> CONFIG get requirepass //默认redis 没有设置密码
1) "requirepass"
2) ""
127.0.0.1:6379> CONFIG set requirepass "tutorialspoint" //设置密码
OK
127.0.0.1:6379> AUTH "tutorialspoint" //使用密码认证
OK
127.0.0.1:6379> set key1 test
OK
127.0.0.1:6379> get key1
"test"
127.0.0.1:6379> save //该命令将在Redis目录创建dump.rdb.
OK
高级用法
通过java app 连接到redis server
前提条件:
使用maven 创建java project
ninjamac@ip-192-168-1-2 java % mvn archetype:generate -DgroupId=com.example -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /Users/ninjamac/java
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: myapp
[INFO] Parameter: packageName, Value: com.example
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /Users/ninjamac/java/myapp
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:15 min
[INFO] Finished at: 2025-04-24T17:34:22+08:00
[INFO] ------------------------------------------------------------------------
编辑pom.xml 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>myapp</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>myapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
</project>
编写App.java
package com.example;
import com.google.gson.Gson;
import redis.clients.jedis.Jedis;public class App {public static void main(String[] args) {// Connect to Redis server on localhostJedis jedis = new Jedis("localhost", 6379);System.out.println("Connection to server successful");// Set data in Redisjedis.set("tutorial-name", "Redis tutorial");// Get data from RedisSystem.out.println("Stored string in redis: " + jedis.get("tutorial-name"));}
}
运行mvn clean install编译项目
mvn clean install
运行编译后的jar 文件,该程序向redis server添加一个名为tutorial-name的键,值为Redis tutorial
ninjamac@ip-192-168-1-2 myapp % java -cp "target/myapp-1.0-SNAPSHOT.jar:/Users/ninjamac/.m2/repository/redis/clients/jedis/4.3.0/jedis-4.3.0.jar:/Users/ninjamac/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar" com.example.App
Connection to server successful
Stored string in redis: Redis tutorial
通过redis-cli来验证:
127.0.0.1:6379> get tutorial-name"Redis tutorial"