redis基础

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis基础

1. 简介

一、Redis简介

Redis (Remote Dictionary Server)是用C语言编写的开源数据库,可以将数据放入内存,也可以持久化到磁盘

Redis不同于传统关系型数据库,以key-value的形式存储数据

Redis将数据放置与内存,性能优越,官方给的测试结果:读取数据速度是110000次/s,写入速度为81000次/s

Redis开源免费,提供多种编程语言接口,包括主流的:java,python,php,c#等几十种编程语言,遵从BSD协定

Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

二、Redis适用的业务场景

Redis不能替代传统关系型数据库

适用于:

缓冲高并发读写的实时数据

网站最新信息列表,用户点击计数器,各类信息的实时排名

不适用于:

对事务要求高的业务

需要使用SQL的业务场景

2. redis常用数据类型

一、redis数据类型介绍

Redis实际上是一个数据结构服务器,不光以传统文本的key-value方式存储数据,redis的value除了包括传统的文本value,还可以包括多种形式的数据结构以存储更加复杂的数据结构数据。redis的value常用的数据结构包括:

| 类型 | 简介 | 特性 | 场景 |

| — | — | — | — |

| String(字符串) | 二进制数据 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | 头像存储 |

| Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |

| List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |

| Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |

| Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |

3. redis相关命令

一、连接radis命令

语法

redis-cli -h host -p port -a password

实例

演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上。

redis-cli -h 127.0.0.1 -p 6379 -a “mypass”

有时候会有中文乱码。要在 redis-cli 后面加上 --raw

redis-cli --raw

二、其他常用命令

flushdb清空当前数据库的所有值(慎用)

select切换数据库

select 15切换到第16个数据库

select 1 切换到第1个数据库

scan查看当前数据库的所有key

例如:scan 0 match * count 100

其中0为产生一个新的游标,match后为匹配模式 *为所有,count 为显示数量

4. redis的key

一、简介

redis的key用来定位数据,可以想象成引用数据的标签

key在当前数据库中不能有重值(默认16个数据库,数据库可以想象成分类目录,一般情况一个业务系统的数据放在一个数据库中)

key的名字不宜过长(超过1024),否则影响性能

key最多可以存512M

key命名规则除了空格、\n换行外,其他的字符都可以

二、key命令

语法

Redis 键命令的基本语法如下:

redis 127.0.0.1:6379> COMMAND KEY_NAME

实例

redis 127.0.0.1:6379> SET runoobkey redis

OK

redis 127.0.0.1:6379>DEL runoobkey

(integer) 1

在以上实例中 DEL 是一个命令, runoobkey 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0

Redis keys 命令

查看key

| 命令 | 描述 |

| — | — |

| exists key | 查找指定key是否存在 |

| keys pattern | 通配符匹配符合条件的key |

| dbsize | 查看当前数据库key数量 |

| type key | 查看key的值类型 |

删除key

| 命令 | 描述 |

| — | — |

| del key1 key2 | 删除指定key |

| flushdb | 删除当前数据库的所有key |

| flushall | 删除所有数据库中的key |

修改key

| 命令 | 描述 |

| — | — |

| rename oldkey newkey | 重命名key |

其他操作

| 命令 | 描述 |

| — | — |

| expire key seconds | 指定key过期时间,秒为单位,过期后自动删除 |

| ttl key | 返回key过期时间 |

| select dbname | 选择数据库 |

| move key dbname | 将key移动到指定数据库 |

三、示例

keys *查询所有key

exists查看key是否存在

返回1为存在,0为不存在

dbsize查看当前数据库数量

type key查看key对应value的数据类型

del删除指定key

rename重命名key

expire设置key过期时间

ttl查看key过期时间

5. redis字符串(Strings)

一、简介

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

二、命令

设定key值

| 命令 | 描述 |

| — | — |

| set key value | 设置key对应的string类型的值 |

| mset key1 value1 keyN valueN | 一次设置多个key值 |

| setnx key value | 只有在 key 不存在时设置 key 的值 |

查询key值

| 命令 | 描述 |

| — | — |

| get key | 设置key对应的string类型的值 |

| mget key1 keyN | 一次获取多个key值 |

修改key值

| 命令 | 描述 |

| — | — |

| incr key | 对key的值做加1操作 |

| decr key | 对key的值做减1操作 |

| incrby key integer | 同incr,加指定值 |

| decrby key integer | 同decr,减指定值 |

| append key value | 给指定key的字符串追加value |

其他操作key值(操作后不保存)

| 命令 | 描述 |

| — | — |

| substr key start end | 返回截取过的key的字符串 |

| getrange key start end | 返回截取过的key的字符串 |

| strlen key | 返回key所储存的字符串值的长度 |

三、常用操作举例

set语句设置key对应的value值

mset语句获取key对应的value值

get语句获取key对应value值

mget语句获取多个key对应value值

incr递增步长

incrby指定步长

decr递减步长

decrby指定步长

append追加字符串

substr截取字符串

6. Redis哈希(Hash)

一、简介

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

每个 hash 可以存储 232 -1 键值对(40多亿)。

二、hash命令

添加哈希表字段

| 命令 | 描述 |

| — | — |

| lrange key start end | 获取链表中从start开始到end的值,start从0开始计,倒数第一元素的位置为-1 |

| llen key | 获得列表元素的个数 |

| lindex key 位置 | 获取指定位置列表的值 |

查询哈希表字段

| 命令 | 描述 |

| — | — |

| HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |

| HGET key field | 获取存储在哈希表中指定字段的值。 |

| HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |

| HKEYS key | 获取所有哈希表中的字段 |

| HLEN key | 获取哈希表中字段的数量 |

| HMGET key field1 [field2] | 获取所有给定字段的值 |

| HVALS key | 获取哈希表中所有值 |

删除哈希表字段

| 命令 | 描述 |

| — | — |

| HDEL key field1 [field2] | 删除一个或多个哈希表字段 |

| llen key | 获得列表元素的个数 |

| lindex key 位置 | 获取指定位置列表的值 |

操作哈希表字段

| 命令 | 描述 |

| — | — |

| HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |

| HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |

| lindex key 位置 | 获取指定位置列表的值 |

| HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |

7. Redis列表(List)

一、简介

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),这使得list既可以用作栈,也可以用作队列。

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

二、命令

添加list元素

| 命令 | 描述 |

| — | — |

| lpush key value1 valueN | 左侧添加元素到列表(头部添加) |

| rpush key value1 valueN | 右侧添加元素到列表(尾部添加) |

| linsert key BEFORE|AFTER pivot value | 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 |

查看list元素

| 命令 | 描述 |

| — | — |

| lrange key start end | 获取链表中从start开始到end的值,start从0开始计,倒数第一元素的位置为-1 |

| llen key | 获得列表元素的个数 |

| lindex key 位置 | 获取指定位置列表的值 |

移出list元素

| 命令 | 描述 |

| — | — |

| lpop key | 左侧获取并删除一个元素(头部删除) |

| rpop key | 右侧获取并删除一个元素(尾部删除) |

| lrem key count value | 删除指定value的元素 |

| ltrim key count value | 保留指定范围内的元素,其他的删除 |

操作list元素

| 命令 | 描述 |

| — | — |

| lset key index value | 通过索引来设置元素的值 |

8. Redis集合(Set)

一、简介

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

二、命令

添加集合

| 命令 | 描述 |

| — | — |

| SADD KEY_NAME VALUE1…VALUEN | 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略 |

查询集合

| 命令 | 描述 |

| — | — |

| SMEMBERS key | 返回集合中的所有的成员 |

| SINTER KEY KEY1…KEYN | 返回给定所有给定集合的交集 |

| SDIFF FIRST_KEY OTHER_KEY1…OTHER_KEYN | 返回给定集合之间的差集 |

| SUNION KEY KEY1…KEYN | 返回给定集合的并集 |

| SCARD KEY_NAME | 返回集合中元素的数量 |

移出集合成员

| 命令 | 描述 |

| — | — |

| SPOP key [count] | 移除集合中的指定 key 的一个或多个随机元素 |

| SREM KEY MEMBER1…MEMBERN | 移除集合中的一个或多个成员元素 |

| SMOVE SOURCE DESTINATION MEMBER | 将指定成员 member 元素从 source 集合移动到 destination 集合 |

9. Redis有序集合(sorted set)

一、简介

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的权。redis正是通过权值来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

二、命令

添加元素到集合

| 命令 | 描述 |

| — | — |

| ZADD key score1 member1 [score2 member2] | 添加一个或多个成员,或者更新已存在成员的分数 |

删除集合元素

| 命令 | 描述 |

| — | — |

| ZREM key member [member …] | 移除有序集合中的一个或多个成员 |

修改集合元素

| 命令 | 描述 |

| — | — |

| ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |

查询集合元素

| 命令 | 描述 |

| — | — |

| ZCARD key | 获取有序集合的成员数 |

| ZRANK key member | 返回有序集合中指定成员的索引 |

| ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |

| ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员 |

| ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |

| ZSCORE key member | 返回有序集中,成员的分数值 |

| ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |

10. Redis持久化

redis为了内部数据的安全,会把本身的数据以文件的形式保存到硬盘一份,在服务器重启之后会自动把硬盘的数据恢复到内存redis的里边,数据保存到硬盘的过程就称为持久化

一、snap shotting快照持久化

简介

该持久化默认开启,一次性把redis中全部的数据保存一份到硬盘中,如果数据非常多,就不适合频繁该持久化操作

文件位置

Redis快照持久化频率,配置文件修改

满足在X秒内,超过Ykb大小的数据改变,则保存

快照文件配置

手动建立快照

本地备份

redis-cli bgsave

异机备份

redis-cli -p 192.168.1.1 6379 bgsave

二、append only file(AOF持久化)

本质

把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体的指令而已

开启AOF持久化(会清空数据库)

修改配置后重启服务

AOF追加持久化备份频率

AOF备份文件压缩优化

本地备份

redis-cli bgrewriteaof

异机备份

redis-cli -p 192.168.1.1 6379 bgrewriteaof

11. Redis事务

一、Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

批量操作在发送 EXEC 命令前被放入队列缓存。

收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。

在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

开始事务。

命令入队。

执行事务。

二、实例

以下是一个事务的例子, 它先以MULTI开始一个事务, 然后将多个命令入队到事务中, 最后由EXEC命令触发事务, 一并执行事务中的所有命令:

redis 127.0.0.1:6379> MULTI

OK

redis 127.0.0.1:6379>SET book-name “Mastering C++ in 21 days”

QUEUED

redis 127.0.0.1:6379>GET book-name

QUEUED

redis 127.0.0.1:6379>SADD tag “C++” “Programming” “Mastering Series”

QUEUED

redis 127.0.0.1:6379>SMEMBERS tag

QUEUED

redis 127.0.0.1:6379>EXEC

1) OK

2) “Mastering C++ in 21 days”

3) (integer)3

4) 1) “Mastering Series”

2) “C++”

3) “Programming”

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

比如:

redis 127.0.0.1:7000> multi

OK

redis 127.0.0.1:7000> set a aaa

QUEUED

redis 127.0.0.1:7000> set b bbb

QUEUED

redis 127.0.0.1:7000> set c ccc

QUEUED

redis 127.0.0.1:7000> exec

1) OK

2) OK

3) OK

三、Redis 事务命令

12. Redis数据备份与恢复

一、数据备份(SAVE)

Redis SAVE 命令用于创建当前数据库的备份。

语法

redis Save 命令基本语法如下:

redis 127.0.0.1:6379> SAVE

实例

redis 127.0.0.1:6379> SAVE

OK

该命令将在 redis 安装目录中创建dump.rdb文件。

二、数据备份(BGSAVE)

创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。

实例

127.0.0.1:6379> BGSAVE

Background saving started

三、恢复数据

如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:

redis 127.0.0.1:6379> CONFIG GET dir

1) “dir”

2) “/usr/local/redis/bin”

以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。

相关文章
|
分布式计算 数据处理 Apache
Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
【10月更文挑战第10天】Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
1441 1
|
算法 开发者 微服务
编码之道:我的技术感悟之旅
在数字世界的迷宫中,每一次代码的敲击都是对未知的探索。本文旨在揭示编程实践背后的深层逻辑与哲学思考,从个人经历出发,探讨如何通过技术提升解决问题的能力,以及在不断学习与实践中获得的成长。文章将分享作者在面对复杂问题时的思维方式,以及如何将理论知识与实际项目相结合的经验。
117 27
|
7月前
|
存储 SQL 缓存
Apache Doris & SelectDB 技术能力全面解析
本文将对 Doris & SelectDB 适合的分析场景和技术能力进行概述解析
1211 1
Apache Doris & SelectDB 技术能力全面解析
|
7月前
|
人工智能 安全 开发者
2025 年 WordPress 本地部署工具深度测评:3 大高效实践方案解析
随着 WordPress 6.4 的普及,本地开发工具向智能化、场景化发展。个人开发者追求零配置启动,企业团队需标准化方案。技术演进聚焦容器化整合、AI 辅助决策与边缘计算适配。深度测评中,WordPress Studio 适合快速原型开发,Websoft9 面板适用于企业级管理,Bulk Plugin Installer 提升批量部署效率。2025 年行业趋势显示容器化、AI 辅助及边缘计算支持成为主流,选型应结合项目规模与安全需求。
274 0
|
消息中间件 Kafka 流计算
FlinkKafkaConsumer相同group.id多个任务消费kafka问题
当使用FlinkKafkaConsumer消费Kafka时,即使设置了相同的group.id,由于Flink内部管理partition的消费offset,两个程序仍能同时消费所有数据。这与KafkaConsumer不同,后者严格遵循消费组隔离原则,避免重复消费同一分区的数据。Flink为实现exactly-once语义,需要独立管理offset,这导致了上述现象。
|
数据采集 缓存 测试技术
性能测试中,除了迭代次数,还有哪些因素会影响测试结果?
性能测试中,除了迭代次数,还有哪些因素会影响测试结果?
360 2
|
UED
产品服务需求分析与概念设计阶段
产品服务需求分析与概念设计阶段
357 3
|
关系型数据库 MySQL API
Apache Doris集群部署
Apache Doris集群部署
|
Python
[python]为指定目录下的文件名批量加前缀
[python]为指定目录下的文件名批量加前缀
205 3
|
消息中间件 Kafka Linux
安装Kafka3.0
消息队列是当前分布式系统中不可或缺的一部分了,今天先简单学习一下安装吧。
527 0

热门文章

最新文章