Redis入门基础知识

    技术2026-03-12  2

    Redis&Jedis

    前言:

    ​ 当存在海量用户与高并发问题时,关系型数据库会出现性能瓶颈(磁盘IO性能低下) 、扩展瓶颈(数据关系复杂,扩展性差,不便于大规模集群)。mysql数据库数据存放在磁盘,cpu读取磁盘数据慢,读取内存数据速度更快。对于开发环境来说,大部分数据存放在mysql,少部分热点数据存放内存。

    **Nosql非关系型数据库:**作为关系型数据库的补充,对数据没有硬性的结构规定。

    特征:可扩容、可伸缩,大数据量下高性能,灵活的数据模型, 高可用

    常见:Hbase、Redis、 memcache、MongoDB

    概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。

    特征:

    数据间没有必然的关联关系内部采用单线程机制进行工作高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。多数据类型支持: ◆ 字符串类型 string ◆ 列表类型 list ◆ 散列类型 hash ◆ 集合类型 set ◆ 有序集合类型 zset/sorted_set支持持久化,可以进行数据灾难恢复

    功能性命令

    设置 key,value 数据:set key value根据 key 查询对应的 value,如果不存在,返回空(nil):get key获取命令帮助文档:help [command]获取组中所有命令信息名称:help [@group-name]退出客户端:quit /exit 快捷键Ctrl+C

    String类型数据基本操作

    添加/修改单个数据 :set key value 多个数据:mset key1 value1 key2 value2 …

    获取数据:get key 多个数据:mget key1 key2 …

    删除数据 :del key

    判定性添加数据: setnx key value

    获取数据字符个数(字符串长度):strlen key

    追加信息到原始信息后部(如果原始信息存在就追加,否则新建):append key value

    扩展操作

    设置数值数据增加指定范围的值

    incr key/ incrby key increment/ incrbyfloat key increment

    设置数值数据减少指定范围的值

    decr key/ decrby key increment

    设置数据具有指定的生命周期

    setex key seconds value/ psetex key milliseconds value

    Hash类型数据基本操作

    添加/修改单个数据 :hset key field value 多个数据:hmset key field1 value1 field2 value2 …

    获取数据:hget key field/ hgetall key 多个数据:hmget key field1 field2 …

    删除数据 :hdel key field1 [field2]

    设置field的值,如果该field存在则不做任何操作:hsetnx key field value

    获取哈希表中字段的数量:hlen key

    获取哈希表中是否存在指定的字段:hexists key field

    扩展操作
    获取哈希表中所有的字段名或字段值:hkeys key/ hvals key设置指定字段的数值数据增加指定范围的值:hincrby key field increment/ hincrbyfloat key field increment

    List类型数据基本操作

    添加/修改数据

    lpush key value1 [value2] ……

    rpush key value1 [value2] ……

    获取数据

    lrange key start stop

    lindex key index

    llen key

    获取并移除数据

    lpop key

    rpop key

    扩展操作

    移除指定数据:lrem key count value

    规定时间内获取并移除数据:

    blpop key1 [key2] timeout

    brpop key1 [key2] timeout

    brpoplpush source destination timeout

    Set类型数据基本操作

    添加数据

    sadd key member1 [member2]

    获取全部数据

    smembers key

    删除数据

    srem key member1 [member2]

    获取集合数据总量

    scard key

    判断集合中是否包含指定数据

    sismember key member

    随机获取集合中指定数量的数据

    srandmember key [count]

    随机获取集合中的某个数据并将该数据移出集合

    spop key [count]

    扩展指令

    求两个集合的交、并、差集

    sinter key1 [key2 …]

    sunion key1 [key2 …]

    sdiff key1 [key2 …]

    求两个集合的交、并、差集并存储到指定集合中

    sinterstore destination key1 [key2 …]

    sunionstore destination key1 [key2 …]

    sdiffstore destination key1 [key2 …]

    将指定数据从原始集合中移动到目标集合中

    smove source destination member

    key常用指令

    删除指定key:del key

    获取key是否存在:exists key

    获取key的类型:type key

    扩展操作

    排序:sort

    改名:rename key newkey/ renamenx key newkey

    为指定key设置有效期

    expire key seconds

    pexpire key milliseconds

    expireat key timestamp

    pexpireat key milliseconds-timestamp

    获取key的有效时间

    ttl key

    pttl key

    切换key从时效性转换为永久性:persist key

    查询key:keys pattern

    * 匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号

    keys *查询所有keys it*查询所有以it开头keys *heima查询所有以heima结尾keys ??heima查询所有前面两个字符任意,后面以heima结尾keys user:?查询所有以user:开头,最后一个字符任意keys u[st]er:1查询所有以u开头,以er:1结尾,中间包含一个字母,s或t

    db基本操作

    切换数据库:select index其他操作:ping数据移动:move key db数据总量:dbsize数据清除:flushdb/ flushall

    Redis数据库连接池

    参数 ipport数据库连接池数量 定义 导包加载配置文件创建类

    Redis持久化

    什么是持久化:利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 持久化用于防止数据的意外丢失,确保数据安全性

    目的: 防止数据丢失对数据进行备份(磁盘)实现方式 直接拷贝内存中的数据保存到磁盘(RDB)记录用户的操作日志(AOF)

    RDB

    手动备份 直接执行save指令

    使用

    修改配置文件dbfilename 指定存储备份文件名称,默认存储位置在dir

    daemonize yes port 6379 dir ./data #logfile "logfilr.log" dbfilename "mydump.rdb"

    执行save指令

    bgsave(background save)

    save指令执行时会阻塞redis的进程bgsave会创建子进程去执行备份操作,而不会阻塞redis

    配置频率:设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化

    save 秒(监控时间范围) 次数(监控key的变化量)

    底层任然使用的bgsave指令

    daemonize yes port 6379 dir ./data #logfile "logfilr.log" dbfilename "mydump.rdb" save 30 1
    RDB特殊启动形式
    服务器运行过程中重启:debug reload关闭服务器时指定保存数据:shutdown save
    优点:
    RDB是一个紧凑压缩的二进制文件,存储效率较高RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景RDB恢复数据的速度要比AOF快很多

    应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。

    缺点:

    宕机带来的数据丢失风险,RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据

    大数据量下的IO性能较低

    bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能

    Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

    AOF(记录操作日志)

    概念:AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的。与RDB相比可以简单理解为由记录数据改为记录数据产生的变化,AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

    使用步骤

    修改配置文件

    appendonly yes|no

    appendfilename “append.aof”

    appendfsync always|everysec|no(默认为everysec)

    daemonize yes port 6379 dir ./data #logfile "logfilr.log" dbfilename "mydump.rdb" save 30 1 appendonly yes appendfilename "append.aof" appendfsync everysec

    AOF的重写机制

    随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。

    目的:去掉没有意义的指令记录,降低磁盘占用量,提高磁盘利用率 ;提高持久化效率,降低持久化写时间,提高IO性能 ;降低数据恢复用时,提高数据恢复效率

    实现方式:

    手动: bgrewriteaof, 压缩aof文件

    自动:

    auto-aof-rewrite-min-size size

    auto-aof-rewrite-percentage percentage

    区别:RDB VS AOF

    对数据非常敏感,建议使用默认的AOF持久化方案

    AOF持久化策略使用everysecond,每秒钟fsync一次。该策略redis仍可以保持很好的处理性能,当出 现问题时,最多丢失0-1秒内的数据。注意:由于AOF文件存储体积较大,且恢复速度较慢

    数据呈现阶段有效性,建议使用RDB持久化方案

    数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段 点数据恢复通常采用RDB方案注意:利用RDB实现紧凑的数据持久化会使Redis降的很低,慎重总结:

    综合比对

    RDB与AOF的选择实际上是在做一种权衡,每种都有利有弊

    如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF

    如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB

    灾难恢复选用RDB

    双保险策略,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量

    Redis安装(Linux)

    1. 上传安装包

    下载安装包上传到虚拟机

    2. 安装gcc环境

    yum -y install gcc-c++ tcl

    3. 解压

    tar -zxvf redis-5.0.0.tar.gz

    4. make

    进入解压目录执行make

    5. make install

    进入解压目录执行make install安装成功屏幕中会出现:Hint:It’s a good idea to run ‘make test’ 😉

    6. 服务器启动

    启动服务器——参数启动

    redis-server [–port port]

    范例

    redis-server --port 6379

    启动服务器——配置文件启动

    redis-server config_file_name

    范例

    redis-server redis.conf

    7. 客户端启动

    启动客户端

    redis-cli [-h host] [-p port]

    范例

    redis-cli –h 61.129.65.248 –p 6384

    Redis基础环境设置约定

    创建配置文件储存目录:mkdir conf

    创建服务器文件储存目录(包含日志、数据、临时配置文件等):mkdir data

    创建快速访问链接:ln -s redis-5.0.0 redis

    服务器端设定

    设置服务器以守护进程的方式运行,开启后服务器控制台中将打印服务器运行信息(同日志内容相同):daemonize yes|no

    绑定主机地址:bind ip

    设置服务器端口号:port port

    设置服务器文件保存地址:dir path

    客户端配置
    服务器允许客户端连接最大数量,默认0,表示无限制。当客户端连接到达上限后,Redis会拒绝新的连接:maxclients count客户端闲置等待最大时长,达到最大值后关闭对应连接。如需关闭该功能,设置为 0:timeout seconds
    日志配置
    设置服务器以指定日志记录级别:loglevel debug|verbose|notice|warning日志记录文件名:logfile filename

    常见问题

    1. 没有wget命令(-bash: wget: 未找到命令)
    yum -y install wget
    2. 下载网络受限
    下载地址 wget --no-check-certificate http://download.redis.io/releases/redis-5.0.0.tar.gz

    Jedis

    简介: Jedis用于Java语言连接redis服务,并提供对应的操作API

    准备工作:

    jar包导入

    下载地址:https://mvnrepository.com/artifact/redis.clients/jedis

    基于maven

    <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>

    客户端连接redis

    操作步骤

    ◆ 导入坐标

    ◆ 创建连接

    ◆ 数据操作

    ◆ 关闭连接

    连接redis

    Jedis jedis = new Jedis("localhost", 6379);

    操作redis

    jedis.set("name", "itheima"); jedis.get("name");

    关闭redis连接

    jedis.close(); API文档:http://xetorthio.github.io/jedis/

    Jedis简易工具类开发

    基于连接池获取连接

    JedisPool:Jedis提供的连接池技术

    ​ poolConfig:连接池配置对象

    ​ host:redis服务地址

    ​ port:redis服务端口号

    public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port) { this(poolConfig, host, port, 2000, (String)null, 0, (String)null); }
    封装连接参数

    jedis.properties

    jedis.host=192.168.40.130 jedis.port=6379 jedis.maxTotal=50 jedis.maxIdle=10
    加载配置信息

    静态代码块初始化资源

    static{ //读取配置文件 获得参数值 ResourceBundle rb = ResourceBundle.getBundle("jedis"); host = rb.getString("jedis.host"); port = Integer.parseInt(rb.getString("jedis.port")); maxTotal = Integer.parseInt(rb.getString("jedis.maxTotal")); maxIdle = Integer.parseInt(rb.getString("jedis.maxIdle")); poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(maxTotal); poolConfig.setMaxIdle(maxIdle); jedisPool = new JedisPool(poolConfig,host,port); }
    获取连接

    对外访问接口,提供jedis连接对象,连接从连接池获取

    public static Jedis getJedis(){ Jedis jedis = jedisPool.getResource(); return jedis; }

    实用小技巧

    window查看占用端口进程并关闭
    //1. 查看端口当前占用的进程id netstat -ano | findstr 6379 //2. taskkill taskkill /f /pid 10352
    linux中端口占用
    ps -ef | grep 进程名 kill -9 进程id
    linux复制

    复制: crtl + insert

    粘贴:shift + insert

    edisPoolConfig(); poolConfig.setMaxTotal(maxTotal); poolConfig.setMaxIdle(maxIdle); jedisPool = new JedisPool(poolConfig,host,port); }

    ##### 获取连接 对外访问接口,提供jedis连接对象,连接从连接池获取 ```java public static Jedis getJedis(){ Jedis jedis = jedisPool.getResource(); return jedis; }

    实用小技巧

    window查看占用端口进程并关闭
    //1. 查看端口当前占用的进程id netstat -ano | findstr 6379 //2. taskkill taskkill /f /pid 10352
    linux中端口占用
    ps -ef | grep 进程名 kill -9 进程id
    linux复制

    复制: crtl + insert

    粘贴:shift + insert

    Processed: 0.011, SQL: 9