Redis入门学习

一、Redis(Remote Dictionary Server)的介绍

1.Redis的特性

速度快:redis所有的数据都放在内存中;使用c语言实现的程序距离操作系统更近,执行速度相对较快;单线程架构可以预防多线程产生的竞争问题。

基于键值对的数据结构服务器

丰富的功能:提供键过期功能来实现缓存;发布功能来实现消息系统等

简单稳定、客户端语言多:Redis提供简单的TCP通信协议可以使很多变成语言接入Redis

持久化:可以通过RDB或者AOF两种策略将内存中的数据保存到硬盘中

主从复制

高可用和分布式:保证Redis节点的故障和故障自动转移

2.Redis可以做什么

缓存:合理使用缓存不仅可以加快数据的访问速度能够降低后端数据源的压力

排行榜系统:Redis提供的列表和有序集合的数据结构可以比较方便的构建排行榜系统

计数器应用:Redis天然支持计数功能并且计数的性能比较好可以很好的实现并发量很大的播放数或浏览量数据的实时性。

消息队列系统:Redis提供的发布订阅和阻塞队列的功能可以进行业务的解耦

3.linux上安装好redis后的启动方式

默认配置

redis-server 该种启动方式无法自定义配置

运行启动

redis-server --configKey test 加上修改配置名和值,没有的使用默认配置

redis-server --port 6380 用6380作为端口启动redis

配置文件启动

redis-server /opt/redis/redis.conf 将配置写到指定的文件里

4.redis命令行客户端

交互式

redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> set hello world

127.0.0.1:6379> get hello

"world"

命令方式

redis-cli -h 127.0.0.1 -p 6379 get hello

"world"

以上两种方式中如果没有-h参数默认连接的使127.0.0.1,如果没有-p,默认使用的端口是6379

5.停止redis服务

redis-cli shutdown 该命令将暂停127.0.01上的6379端口上的redis服务

redis关闭的过程:断开与客户端的连接,持久化文件生成;也可以通过kill进程号的方式关闭掉redis,但是如果使用kill-9强制杀死redis服务不但不会做持久化操作还会造成缓冲区等资源不能被正常的关掉

redis-cli shutdown nosave|save 该命令后面的参数表示是否在关闭redis前生成持久化文件。

二、Redis API的使用

1.全局命令:

Ⅰ.查看所有的键:keys *

当插入3对字符串类型的键值对

127.0.0.1:6379> set hello world

OK

127.0.0.1:6379> set java jedis

OK

127.0.0.1:6379> set python redis-py

OK

Ⅱ.键总数

dbsize:返回当前数据库中键的总数,其在计算键总数时不会遍历所有的键而是直接获取redis内置的键总数变量

当使用 rpush mylist a b c d e f g

会返回(Integer)7

Ⅲ.检查键是否存在

exists key:如果键存在返回1,不存在返回0

Ⅳ.删除键

del key:其执行成功后返回删除键的个数,也可以支持删除多个键

Ⅴ.键过期

expire key seconds:当超过过期时间后会自动删除键,执行该命令会返回键的剩余时间,返回大于0的整数表示键剩余的过期时间,返回-1则表示键没有设置过期时间,返回-2表示键不存在,同时也可以通过 ttl key 来观察key的过期时间

Ⅵ.键的数据结构

type key:如果是字符串类型则返回string,列表类型返回的是list类型,如果键不存在则返回none

2.数据结构和内部编码

3.单线程架构

开启三个redis-cli客户端同时执行命令

客户端调用都经历发送命令、执行命令、返回结果的三个过程,redis使用单线程处理命令,所以一条命令从客户端到达服务端不会被立刻执行,所有的命令都会进入一个队列中逐个被执行即上面3个客户端命令执行的顺序不确定,但是不会存在两条命令同时执行,所以不会存在并发的问题,所以incr的结果都是2不会产生并发的问题。

单线程快的原因:

第一,纯内存访问,redis将所有的数据放在内存中响应时间大约为100ns

第二,非阻塞I/O,redis使用epoll作为I/O多路复用技术的实现

第三,单线程避免线程切换和竞态产生的消耗

4.字符串

字符串是redis最基础的数据结构,所有的键都是字符串类型并且其他几种数据结构都是在字符串的类型基础上构建的。

Ⅰ.设置值:set key value

如果key已经存在,若使用setnx继续创建会创建失败返回结果0

根据setnx的这种特性,可以将其作为分布式锁的一种实现方案

Ⅱ.获取值:get key

如果获取的键不存在会返回空

mset key value:批量设置值,例如:mset a 1 b 2 c 3 d 4

mget key:批量获取值,例如:mget a b c d

如果有些键不存在,那么它的返回值为空

批量操作命令可以有效提高开发的效率,如果没有mget这样的命令,要执行n次get命令需耗时:n次网络时间+n次命令时间,使用批量操作命令需耗时:1次网络时间+n次命令的时间。

Ⅲ.计数:incr key

对值进行自增操作,如果键不存在,按照值为0自增,返回结果为1

除此之外,还有decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数)

Ⅳ.追加值:append key value

可以向字符串尾部追加值

Ⅴ.字符串长度:strlen key

返回字符串的长度,如果含有中文,一个中文占3个字节

Ⅵ.getset key value

同时会返回键原来的值

Ⅶ.设置指定位置的字符

setrange key offset value

Ⅷ.获取部分字符串

getrange key start end

其中start 和end分别是开始和结束的偏移量,偏移量从0开始计算

5.内部编码

6.缓存功能

7.哈希

命令:

Ⅰ.设置值:hset key field value

例:hset user:1 name tom

执行成功会返回1,反之会返回0

Ⅱ.获取值

hget key field

hget user:1 name,会返回结果"tom",如果键不存在会返回空

Ⅲ.删除field

hdel key field

hdel user:1 name,会删除一个或多个field

Ⅳ.计算field个数

hlen key

Ⅴ.批量设置或获取field-value

hmget key field

hmget user:1 name city,会返回name和city对应的值

Ⅵ.判断field是否存在

hexists key field

hexists user:1 name,如果其包含name域会返回1,不包含会返回0

Ⅶ.获取所有的field

hkeys key

hkeys user:1,返回指定哈希键的所有field

Ⅷ.获取所有的value

hvals key

hvals user:1,返回1全部的value

Ⅸ.获取所有的field-value

hgetall key

hgetall user:1,获取user:1所有的field-value

8.列表:存储多个有序的字符串,列表中每个字符串称为元素,一个列表最多可有2^32-1个元素,在redis中,可以对列表两端插入和弹出,还可以获取指定范围的元素列表,获取指定索引下标的元素。

特点:列表中的元素是有序的,即可以通过索引下标获取某个元素或者范围内的元素列表,其中的元素可以重复

命令

Ⅰ.添加操作

rpush key value 从右边插入元素

rpush listkey c b a 从右向左插入元素

lpush key value 从左边插入元素,用法和rpush相同

linsert key before | after pivot value linsert命令会从列表中找打pivot的元素,在其前面或者后面插入一个新的元素value

linsert listkey before b java 在b前面插入java

Ⅱ.查找

lrange key start end 获取指定范围内的元素列表

该索引下标分为从左到右0-N-1,但是从右到左分别是-1到-N,lrange中的end选项包含自身

lindex key index 获取列表指定索引下标的元素

lindex listkey -1 获取当前列表中最后一个元素

llen key 获取列表长度

Ⅲ.删除

lpop key 从列表左侧弹出元素

rpop key 从列表右侧弹出

lrem key count value 删除指定的元素

上条命令中,lrem会从列表中找到等于value元素进行删除,如果count>0,表示从左到右并删除最多count个元素,count<0表示从右到左删除最多count绝对值个元素,count=0,删除所有

ltrim key start end 按照索引范围修剪列表

ltrim listkey 1 3 表示只保留listkey中第2-4个元素

Ⅴ.修改

lset key index newValue 修改指定索引下标的元素

Ⅵ.阻塞操作

blpop和brpop是lpop和rpop的阻塞版本

brpop list:test 3 客户端要等3s后返回,如果timeout=0客户端会一直阻塞

9.集合

集合也是用来保存多个的字符串元素,但是其中不允许有重复元素并且集合中的元素是无序的,不能通过索引下标获取元素。

命令:

Ⅰ.添加元素:sadd key element,运行结果返回添加成功的元素的个数

sadd myset a b c,返回结果为3

Ⅱ.删除元素:srem key element

srem myset a b,返回结果是成功删除的元素个数

Ⅲ.计算元素的个数:scard key

scard myset,返回的是集合中元素的个数

Ⅴ.判断元素是否在集合中:sismember key element,在集合返回1,反之返回0

Ⅵ.随机从集合返回指定个数元素:srandmember key

srandmenber myset 2,会随机返回集合中的两个元素

Ⅶ.从集合中随机弹出元素:spop key

Ⅷ.获取所有元素:smembers key

smembers myset获取集合myset所有元素并且返回的结果是无序的

Ⅸ.集合间操作

sinter key:求多个集合的交集

sunion key:求多个集合的并集

sdiff key:求多个集合的差集

使用场景:

10.有序集合:有序集合中的元素可以进行排序,它是给每个元素设置一个分数作为排序的依据

有序集合中的元素不允许重复但score可以重复。

命令:

Ⅰ.添加成员:zadd key score member

zadd user:ranking 251 tom

Ⅱ.计算成员个数:zcard key

zcard user:ranking

Ⅲ.计算某个成员的分数:zsocre key member

zscore user:ranking tom

Ⅳ.计算成员的排名:zrank key member(从低到高) zrevrank key member(从高到低)

Ⅴ.删除成员:zrem key member

zrem user:ranking mike

Ⅵ.增加成员分数:zincrby key increment member

zincrby user:ranking 9 tom,表示给tom增加9分

Ⅶ.返回指定排名范围的成员:zrange key start end(从低到高返回) zrevrange key start end(从高到低返回)

Ⅷ.返回指定分数范围的成员:zrangebyscore key min max

返回指定分数范围的成员个数:zcount key min max

Ⅸ.删除第start到第end名成员:zremrangebyrank user:ranking 0 2

相关推荐
数智化管理手记7 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
Xudde.7 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
翊谦7 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh7 小时前
JavaSE学习——迭代器
java·开发语言·学习
難釋懷8 小时前
OpenResty实现Redis查询
数据库·redis·openresty
421!8 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
别抢我的锅包肉8 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip
Database_Cool_8 小时前
OpenClaw-Observability:基于 DuckDB 构建 OpenClaw 的全链路可观测体系
数据库·阿里云·ai
AI成长日志9 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
刘~浪地球9 小时前
Redis 从入门到精通(五):哈希操作详解
数据库·redis·哈希算法