[Redis] Redis (1) 基础与概述

1 概述

1.0 定义

  • Redis(Remote Dictionary Server(远程字典服务))是一款开源的、由 Salvatore Sanfilippo 写的、遵守 BSD 协议的、使用ANSI C语言编写的、支持多种语言API的(跨平台的)、支持网络的、分布式的、高性能的、基于内存运行亦可持久化的日志型、(Key-Value)键值对NoSQL/非关系型数据库。

    • NOSQL(not only sql)不仅仅是sql,对所有非关系型数据库的一种通称。
    • 读写速度非常快,每秒可以处理超过10万次读写操作。
    • Redis被广泛应用于缓存分布式锁等场景
    • 此外,Redis支持事务持久化LUA 脚本LRU 驱动事件多种集群方案
    • 同类的产品还有memcache 、memcached 等。
  • Redis 通常也被称为数据结构服务器

  • 因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等数据结构类型
  • 还支持基于字符串的bitmap扩展数据结构

1.1 特点

1.1.1 特点

  • 内存数据库,读写速度快、效率高
  • 支持数据的持久化,可以将数据保存在磁盘中,重启之后可以再次加载到内存中使用
  • 支持多种数据结构,除了KV类型的数据,还支持list、set、hash等数据结构
  • 支持master-slave模式的数据备份
  • 支持事务

1.1.2 优点

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

1.1.3 Redis为什么这么快?

  • 1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。

数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

  • 2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

  • 3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

  • 4、使用多路I/O复用模型,非阻塞IO;

  • 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

  • 6、多路 I/O 复用模型
    多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里多路指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

1.1.4 那么为什么Redis是单线程的?

官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽
既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程, 会有很多麻烦!)

1.2 NOSQL和RDBMS的区别

RDBMS

  • 高度组织化结构化数据。
  • 结构化查询语言(SQL) sql语句
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言DML,数据定义语言DDL
  • 严格的一致性. 事务 .
  • 基于事务

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 键 - 值对存储。
  • 非结构化和不可预知的数据 字符串 对象 队列 集合.
  • 高性能,高可用性和可伸缩性。 适合搭建集群。 mysql搭建集群非常复杂。主从模式

常见的NoSQL数据库类型

1.3 内存数据库间的比较

1.3.1 Memcache与Redis的区别都有哪些?

  • 存储方式

Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,redis可以持久化其数据

  • 数据支持类型

memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 ,提供list,set,zset,hash等数据结构的存储

  • 使用底层模型不同

它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

  • value 值大小不同

Redis 最大可以达到 512M;memcache 只有 1mb。

  • 性能

redis的速度比memcached快很多

  • Redis支持数据的备份

即master-slave模式的数据备份。

1.4 应用场景(简述)

  1. 热点数据的缓存: 作为缓存数据。缓存都是基于内存走
  2. 限时业务的运用: 秒杀 存放用户信息 短信保存 。expire
  3. 计数器相关问题: 点赞量 播放量 访问量 incr
  4. 排行榜相关问题:

基于Redis的排行榜主要使用的是Redis的 有序集合(SortedSet)来实现
假定: 添加 成员字段-积分字段 的操作是通过Redis的zAdd操作


ZADD key score member [[score member] [score member] ...]

默认情况下, 若score相同, 则按照 member 的字典顺序排序.

  1. 分布式锁:
# 核心操作: 加锁
setnx {key} {value} {expirationMilliseconds}

# 核心操作: (主动)解锁
expire {key}

2 安装

https://github.com/microsoftarchive/redis/releases

2.1 Windows下安装Redis

  • 下载安装包(Redis-x64-3.2.100.zip),并解压

https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

  • 双击redis-server.exe,启动 redis-server

或 :

  • D:\xx\Redis\redis-server.exe D:\xx\Redis\redis.windows.conf
  • 自带客户端的使用:客户端调用Redis(应用)存储/获取数据[基于String的key-value键值对]
D:\xx\Redis\redis-cli.exe -h 127.0.0.1 -p 6379 

> set myKey abc
OK
> get myKey
"abc"
  • 密码设置问题
  • 查看当前redis有没有设置密码:(以下显示说明没有密码)
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

若响应为"*"而非""时,说明已设置了密码

  • 设置密码(方式一)
127.0.0.1:6379> config set requirepass abcdefg
OK
  • 再次查看当前redis就提示需要密码:
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
  • 设置密码(方式二:永久)
  • 打开配置文件 : redis.conf(假定设置为123)
requirepass foobared
requirepass 123
  • 保存后重启redis即可
  • 客户端通过密码建立与redis服务端的连接
D:\xx\Redis\redis-cli.exe -h <host:127.0.0.1> -p <port:6379> -a <password:123> 

2.2 Redis可视化管理工具 : redisplus

2.3 Redis可视化管理工具 : Another Redis Desktop Manager

https://gitee.com/qishibo/AnotherRedisDesktopManager/releases (gitee)

3 操作与应用

3.0 数据库服务

服务的基本信息/状态信息

  • info

这条命令会返回Redis数据库的运行信息,其中包括所有数据库的信息,以及各个数据库中的键数量等。

> info
# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows  
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:632
run_id:640a441b1ef8226174a37c085a873ba3276e17cc
tcp_port:6379
uptime_in_seconds:832
uptime_in_days:0
hz:10
lru_clock:3206663
executable:D:\Program Files(x86)\Redis\redis-server.exe
config_file:

# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:709928
used_memory_human:693.29K
used_memory_rss:672152
used_memory_rss_human:656.40K
used_memory_peak:746928
used_memory_peak_human:729.42K
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:0.95
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1680927431
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
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:2
total_commands_processed:94
instantaneous_ops_per_sec:0
total_net_input_bytes:1602
total_net_output_bytes:6971
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0

# 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:0.11
used_cpu_user:0.08
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace

查看当前数据库的键值对个数

  • dbsize
> hset user:accessToken:332rfew3454fg5yggh65 userInfo "{\"user\": 12324535,\"phoneNumber\": \"15353562879\"}"
1
> hset user:accessToken:332rfew3454fg5y534532r userInfo "{\"user\": 12324535,\"phoneNumber\": \"15353562879\"}"
1

> select 1
OK
> dbsize
0
> select 10
OK
> dbsize
1
> select 4
OK
> dbsize
2

3.1 Redis数据类型

3.1.0 redis支持的数据类型

redis中key的类型都是字符串类型

redis中value的类型很多:

  • 字符串(string)
  • 散列(hash)
  • Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
  • Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
  • 列表(list)
  • Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
  • 集合(set)
  • Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
  • 集合对象的编码可以是 intset 或者 hashtable。
  • Redis 中集合是通过哈希表实现的。所以,添加,删除,查找的复杂度都是 O(1)。
  • 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
  • 有序集合(zset/sorted set)
  • Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
  • 不同的是:每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序
  • 有序集合的成员是唯一的,但分数(score)却可以重复。
  • 集合是通过哈希表实现的。所以添加,删除,查找的复杂度都是 O(1)。
  • 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
zadd <key> <score1> <value1> <score2> <value2> ...
  • 定制数据类型:具有范围查询的排序集合、位图、超日志、地理空间索引和流

而我们主要学习: string,hash,list,set,sort set.

3.1.1 redis中key的操作

  1. keys *: 查询当前redis中所有的key.
  2. expire key second: 为指定的key设置过期时间
  3. ttl key: 查看指定key的过期时间
  4. del key: 删除指定的key
  5. exists key: 判断指定的key是否存在。 存在返回1 不存在返回0

3.1.2 redis中数据库操作命令

  1. select <databaseId>: 选择/切换到指定数据库

默认情况下,Redis服务器启动时会创建16个数据库,使用号码0-15标识,默认使用0号数据库。
不同数据库拥有不同的命名空间。因此,不同数据库可拥有同名的键

  1. KEYS {databaseId} : 查看指定数据库的键列表
> KEYS *
// 查看所有数据库的键列表

> keys user:*
user:accessToken:332rfew3454fg5yggh65
//键的模式匹配

> KEYS 0
  1. flushdb: 清空当前库
  2. flushall: 清空所有库

3.1.3 string数据类型的命令

  1. SET {key} {value} [EX {seconds}] [PX {milliseconds}] [NX|XX]
  • 设置缓存 K-V,如果 key 已经存在,则重写
  • EX seconds -- 设置过期时间, 单位: seconds
  • PX milliseconds -- 设置过期时间,单位:milliseconds
  • NX -- 只有 key 不存在时才设置 K-V
  • XX -- 只有 key 存在时才设置 K-V //NX和XX只能二选一
#1# set {key} {value}: 存放指定key的字符串类型

#2# setex {key} {seconds} {value} 等效于 set {key} {value} EX {seconds}
> setex test-ex 10 "hello"
OK
> ttl test-ex
3
-----------
> set test-ex "hello" EX 30
OK
> ttl test-ex
26
----------
> ttl test-ex
11
> set test-ex "hello" EX 30 NX
null


#3# SETNX {key} {value} 等效于 SET key value NX 
### 当 key 不存在时,设置缓存 K-V;反之,不存放至redis中

...
  1. get key: 获取指定key值
  2. mset key value key value....: 存储多个key和value的值
  3. mget key key key...:获取多个key对于的值。
  4. incr key: 对指定的key的value进行累加。
  5. decr key: 对指定的key的value进行递减。

3.1.4 hash散列类型的命令

  1. HSET key field value [field value]: 存放指定key的field和value值
> hset user:accessToken:332rfew3454fg5yggh64 wechatSessionKey "43tfe43423"
1

> hset user:accessToken:332rfew3454fg5yggh65 userInfo "{\"user\": 12324535,\"phoneNumber\": \"15353562879\"}"
1
> hset user:accessToken:332rfew3454fg5yggh65 deviceInfo "{\"user\": 12324535,\"deviceId\": \"3524243\"}"
1

> HSET xxx:device:3253245 deviceInfo "1111111"
0
# 第2次及以后设置该field时,为0;表示 该 hash 表的 field[deviceInfo] 已存在
> HSET xxx:device:3253245 deviceInfo "1111"
0

# 依旧返回1,说明本hash表新增的field个数为1 
> HSET xxx:device:3253245 deviceInfo "111" deviceInfo2 "222"
1

# 依旧返回2,说明本hash表新增的field个数为2
> HSET xxx:device:3253245 deviceInfo "111###" deviceInfo3 "333" deviceInfo4 "444"
2
  • hash表、hash field(字段)的过期时间问题:

Redis 原生不支持直接给 hash 表内的字段设置过期时间,但可以给整个 hash 表设置过期时间。
你可以使用 EXPIRE 命令给整个 hash 设置过期时间,或者使用 SETEX 命令同时设置值和过期时间。
HSET myhash field1 "Hello"
EXPIRE myhash 10

  1. HMSET KEY_NAME FIELD1 VALUE1 ... FIELDN VALUEN : 存放多个key的field和value值
  • Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。
  • 此命令会覆盖哈希表中已存在的字段。
  • 如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。
redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN

> hmget xx:device:LXX345324243234 brand_code model_code
OK
(注:返回"OK",而非HSET命令返回的数字)

HMSET xx:device:LXX345324243234 brand_code xx1
hmset xx:device:LXX345324243234 brand_code xx1 model_code xx2
  1. hget key field: 获取指定key的指定field对于的value值。
> hget user:accessToken:332rfew3454fg5yggh65 wechatSessionKey
43tfe43423

> hget user:accessToken:332rfew3454fg5yggh65 userInfo
{"user": 12324535,"phoneNumber": "15353562879"}
  1. hmget key field1 field2 field3 ... : 获取指定key的多个field对于的value值。
  • Redis Hmget 命令用于返回哈希表中,一个或多个给定字段的值。
  • 如果指定的字段不存在于哈希表,那么返回一个 nil 值。
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1

redis 127.0.0.1:6379> HMGET myhash field1 field2 nofield
1) "foo"
2) "bar"
3) (nil)
  • 项目案例
  1. hkeys key: 获取指定key对于的所有field.
> hkeys user:accessToken:332rfew3454fg5yggh65
wechatSessionKey
wechatOpenId
userInfo
  1. hvals key: 获取指定key对应 的所有value值。
> hvals user:accessToken:332rfew3454fg5yggh65
43tfe43423
3254345
{"user": 12324535,"phoneNumber": "15353562879"}
  1. hgetall key: 获取指定key下所有的内容。
> hgetall user:accessToken:332rfew3454fg5yggh65
wechatSessionKey
43tfe43423
wechatOpenId
3254345
userInfo
{"user": 12324535,"phoneNumber": "15353562879"}
  1. HDEL key field1 [field2] : 用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
  • 返回:被成功删除字段的数量,不包括被忽略的字段。
redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN 

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field1
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field2
(integer) 0

3.1.5 list队列类型的命令

  1. lpush key value: 根据key从左边存放对应的队列数据
> lpush test-list:001 A
1
> lpush test-list:001 B
2
> lpush test-list:001 C
3
  1. lrange key start end: 获取key指定的元素
> lrange test-list:001 0 2
C
B
A

> lrange test-list:001 0 10
C
B
A
  1. LPOP key: 从左边获取指定key的第一个元素 并移除该元素。
> LPOP test-list:001
C
> lrange test-list:001 0 3
B
A

3.1.6 set集合类型的命令

  1. SADD key value value ....
  2. smembers key: 获取指定key下所有的元素。
  3. SPOP key: 获取指定key的元素 随机。
  4. SISMEMBER key value 判断元素是否在集合中

和上面list的唯一区别 就是不允许重复,无序。

3.1.7 sort set集合类型的命令

  1. ZADD key score member score membere
    2. ZRANGE
    和上面的set的区别是有序。多了一个字段score

3.1.8 特殊数据结构: bitmap(位图:字符串 + 位操作)

Bitmap(也称为位数组或者位向量等)是一种实现对位的操作的'数据结构',在数据结构加引号主要因为:

  • Bitmap 在redis中本身不是一种独立的数据结构,底层实际上是字符串,可以借助字符串进行位操作

  • Bitmap 单独提供了一套命令,所以与使用字符串的方法不太相同。可以把 Bitmaps 想象成一个以为单位的数组数组的每个单元只能存储 0 和 1,数组的下标在 Bitmap 中叫做偏移量 offset。

详情参见: [Redis]Redis (2) 扩展数据结构: Bitmap - 博客园/千千寰宇

3.1.9 特殊数据结构: GEO(地理位置)

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。

  • geopos:获取地理位置的坐标。

  • geodist:计算两个位置之间的距离。

  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。

  • geohash:返回一个或多个位置对象的 geohash 值。

  • 参考文献

3.1.10 特殊数据结构: hyperloglog(基数统计)

3.1.X REDIS数据类型的经典应用场景

3.2 redis的持久化方式

  • 持久化: 把内存中的数据持久到磁盘的过程,就是持久化。

  • 作用: 防止数据丢失。

  • redis持久化的方式: (1)RDB 快照 (2)AOF 日志追加。

  • RDB 持久性以指定的时间间隔执行数据集的时间点快照 . RDB是redis默认的持久化方式. 存在dump.rdb

  • 什么时候会触发rdb的方式?

save该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:

bgsave 执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

  • 【2】自动触发----底层原理就是调用了bgsave命令

恢复数据:

演示:

  1. 关闭redis服务 2. dump.rdb复制到其他目录 3. 删除dump.rdb 4. 其他服务 看到没有数据
  2. 关闭服务。删除dump.rdb 3. 把备份的dump.rdb复制到当前目录 4.其他redis.

你要把redis rdb文件放入你的安装目录下。

rbd持久化的优缺点

优点: 持久化速度块,恢复速度也快。
缺点: 数据完整性差。

AOF持久化方式

AOF持久化方式
RDB全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。


AOF持久化的优缺点

优点: 数据库完整高。
缺点: 恢复数据时效率低。每次都要往日志文件中追加写命令。

3.3 键操作

3.3.1 随机返回一个键

  • randomkey
> randomkey
user:accessToken:332rfew3454fg5y534532r
> randomkey
user:accessToken:332rfew3454fg5y534532r
> randomkey
user:accessToken:332rfew3454fg5yggh65

3.3.2 检查给定键是否存在

  • exists key [key ...]
> exists user:accessToken:332rfew3454fg5yggh65
1

3.3.3 查看键的类型

  • type {key}
> type user:accessToken:332rfew3454fg5y534532r
hash

3.3.4 修改键名

  • rename {oldKey} {newKey}

可直接覆盖已存在的键

  • Redis Rename 命令用于修改 key 的名称。
  • 改名成功时提示 OK ,失败时候返回一个错误。
  • 当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。
  • 当 NEW_KEY_NAME 已经存在时, RENAME 命令将覆盖旧值。
  • renamenx {oldKey} {newKey}

只在新键名不存在时修改

  • Redis Renamenx 命令用于在新的 key 不存在时,修改 key 的名称 。

【案例】案例1

127.0.0.1:6379> rename set3 sset
OK

127.0.0.1:6379> rename set3 sset
(error) ERR no such key
127.0.0.1:6379> renamenx sset h1
(integer) 1
127.0.0.1:6379> renamenx h1 world
(integer) 0

【案例】案例2

# redis-cli -h 10.37.xx.yy -p 6379 -a "passwordForAuth" hset "user:accessToken:testTokenForVhr" sg_123 "hello"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
(integer) 1
# redis-cli -h 10.37.xx.yy -p 6379 -a "passwordForAuth" hget "user:accessToken:testTokenForVhr" sg_123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"hello"
# redis-cli -h 10.37.xx.yy -p 6379 -a "passwordForAuth" keys "user:accessToken:*"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1) "user:accessToken:testTokenForVhr"
# redis-cli -h 10.37.19.89 -p 6379 -a "passwordForAuth" rename "user:accessToken:testTokenForVhr" "user:accessToken:testTokenForVhr2"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
# redis-cli -h 10.37.xx.yy -p 6379 -a "passwordForAuth" keys "user:accessToken:*"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1) "user:accessToken:testTokenForVhr2"

【案例】案例3

127.0.0.1:6379> set ret1 123
OK
127.0.0.1:6379> set ret2 456
OK
127.0.0.1:6379> set ret3 789
OK
127.0.0.1:6379> renamenx ret1 ret2  # ret2存在,返回0
(integer) 0
127.0.0.1:6379> renamenx ret1 ret4  # ret4不存在,返回1,修改成功
(integer) 1
127.0.0.1:6379> keys *
1) "ret4"
2) "ret3"
3) "ret2"

3.3.5 移动键至另一数据库

  • move {key} {dbId}

将指定键移动到另一个数据库,当目标数据库已有同名键时放弃执行。

127.0.0.1:6379> get world
"beauty"
127.0.0.1:6379> move world 2
(integer) 1
127.0.0.1:6379> get world
(nil)
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
1) "world"

3.3.6 移除键

  • del {key} [{key2} ...]

同步方式移除

  • unlink {key} [{key2} ...]

异步方式移除,执行时只移除了对键的引用,实际移除操作在后台线程执行

127.0.0.1:6379> del db1111 st2 pi
(integer) 3
127.0.0.1:6379> del db1111 st2 pi
(integer) 0  
127.0.0.1:6379> unlink band hy
(integer) 2
127.0.0.1:6379> unlink band hy
(integer) 0

3.4 值操作

3.4.1 对键的值排序

通过sort命令可对列表元素、集合元素或有序集合成员进行排序,默认进行数字值排序,按从小到大的顺序返回排序后的各个值。

sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]

ALPHA选项指定使用字符串排序而非数字值排序,LIMIT选项可获取部分结果,offset指定跳过的元素数量,count指定需获取数量。
当使用BY选项时,SORT命令将不再依据元素自身的值进行排序,而是按照给定pattern组合成新的key,并按照新key中对应的内容进行排序,新key无时默认内容为0。
GET选项可获取外部键的值作为结果。pattern可接受包含的字符串、包含和->的字符串、#。

127.0.0.1:6379> sort set3
(error) ERR One or more scores can't be converted into double
127.0.0.1:6379> sort set3 alpha
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"   
127.0.0.1:6379> sort set3 alpha limit 0 1
1) "a"
127.0.0.1:6379> sort set3 alpha limit 2 2
1) "c"
2) "d"

127.0.0.1:6379> sadd set1 5 8 2 6 50 9
127.0.0.1:6379> hset p:5 time 200
(integer) 1
127.0.0.1:6379> hset p:7 time 100
(integer) 1
127.0.0.1:6379> hset p:2 time 600
(integer) 1
127.0.0.1:6379> hset p:6 time 500
(integer) 1  
127.0.0.1:6379> sort set1 by p:*->time
1) "50"
2) "8"
3) "9"
4) "5"
5) "6"
6) "2"  

127.0.0.1:6379> sort set1 get p:*->time
1) "600"
2) "200"
3) "500"
4) (nil)
5) (nil)
6) (nil)

4 架构与原理【待完善】

5 FAQ/问题集

Q1 Redis内存溢出:OOM command not allowed when used memory > 'maxmemory'

原因分析

  • redis内存不足,插入数据时内存溢出,导致key无法插入

解决方法

  • 方法1:资源扩容
  • 方法2:删除部分key
Redis的 maxmemory_policy 内存淘汰策略有:

1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)

2、allkeys-lru : 删除lru算法的key

3、volatile-random:随机删除即将过期key

4、allkeys-random:随机删除

5、volatile-ttl : 删除即将过期的

6、noeviction : 永不过期,返回错误

参考文献

Y 推荐文献

Redis 官网

Redis 文档

Redis 命令参考

github 源码仓库

redis 在线测试

X 参考文献

posted @ 2023-03-31 01:54  千千寰宇  阅读(118)  评论(0编辑  收藏  举报