Redis基础

Redis基本知识

  1. 测试redis服务的性能:redis-benchmark
  2. 查看服务器redis的状态是否正常:ping [message]
  3. 查看redis服务的统计信息:info [section],(info Replication查看集群的信息)
  4. redis默认的16个库(数据库实例):作用类似与mysql的数据库实例,redis不能自己手动创建和修改数据库实例,只能由redis服务自动创建,默认情况下redis客户端连接的是第0号数据库。
    可是使用select index命令进行数据库的切换
  5. 查看当前数据库的数据量:dbsize
  6. 查看当前数据库实例中所有的key:keys *
  7. 清空当前数据库中的数据:flushdb
    清空所有数据库中的数据:flushall
  8. 查看redis中所有的配置信息:config get * / config get paramter

Redis的五种数据结构

  1. 字符串(单key-单value):username: root
  2. list列表(单key-多value):有序value,如:userinfo: admin, 123456, 20, ........
  3. set集合(单key-多value):无序value
  4. pojo(单key-对象[属性:值]),hash
  5. zset(单key-多value):有序value,可以自定义顺序,与list不同,与放入的顺序无关

Redis常用命令

  1. 关于key的命令:
    • keys pattern:查看匹配数据库中的key
    • *代表任意字符,?代表一个字符
    • []用来匹配里面的一个字符,如keys [pu]sername, 查找第一个字符为p|s的key
    • 判断redis中key是否存在:exists key [key2, key3] (key的名字) ,返回存在key的个数/0,有一个key存在就返回1,有两个key就返回2,没有就返回0
    • 移动指定key到指定数据库,mv key index (用不多):mv username 1:移动username到1库
    • ttl: 查看指定key的剩余生存时间(time to live): ttl key(查看key的生存时间,没有设置的话,返回-1;如果key不存在,返回-2)
    • 设置key的最大生存时间:expire key seconds
    • 查看指定key的数据类型:type key (String, list, set, zset, hash)
    • 修改key:rename key newkey
    • 删除key:del key [, key2, key3, ...]返回实际删除的key的数量
  2. 有关string类型数据的操作命令:
    • 保存到数据库:set key value, 如果key已经存在,会将其覆盖
    • 获取key对应的value:get key
    • 追加字符串:append key value,向key中追加value,返回值是追加之后的字符串的长度
    • 获取字符串数据的长度: strlen key, 返回该字符串的长度
    • 可以对表示数值的字符串进行加1运算: incr key, 返回运算之后的数据
    • 可以对表示数值的字符串进行减1运算:decr key, 同上
    • 将字符串数值进行加offset元算, incrby key offset, 如:incrby age 10,对age进行加10运算,返回运算之后的结果
    • decrby key offset:同上
    • 获取字符串中的字符串:getrange key start end, start和end都会取到,不会改变数据库,如果是负数的话就是倒数第几个,如getrange username 0 -1
    • setrange key start value:用value来覆盖从下标为start开始的字符串, 如:setrange username 0 admin:将username对应的值改为admin, 返回更改后的字符串长度
    • setex设置字符串数据的同时,设置它的最大生存时间: setex key seconds value
    • setnx key value :设置字符串类型的数据到redis中,当key不存在的时候才能设置成功,否则设置失败。(set not exists) : setnx username admin
    • 批量设置数据到redis中:mset key value key2 value2 key3 value3....
    • 批量获取数据从redis:mget key key2 key3...
    • msetnx批量设置数据到redis中,当所有key都不存在时设置成功,否则设置失败
  3. 有关list类型数据的操作命令:
    • 将一个或多个值依次保存数据到redis中:lpush(头插) rpush(尾插) lpush/rpush key value [ value2 value3 value4 ...]
    • 获取指定列表中的元素:lrange key start end, 如:lrange name 0 -1,获取所有元素
    • 从指定列表中删除并返回表头/表尾数据,lpop key / rpop key
    • 获取指定列表中的表头数据,不删除:lindex key index
    • 获取指定列表的长度:llen key , llen name :获取name列表的长度
    • 根据count的值删除指定列表中某一些数据:lrem key count value (如果count大于0,表示从表头移除count个跟value相等的数据;如果count小于0,表示从表尾移除count个跟value相等的数据;如果count等于0,表示从列表中移除所有跟value相等的数据)
  4. 有关集合set类型数据的操作命令:
    • 将一个或多个数据保存到redis的set集合中:sadd key value[ value2 value3 value4.....], 返回成功加入元素的数量
    • 获取指定集合中的所与元素:smembers key
    • 判断指定元素在指定集合中是否存在:sismember key member ,存在返回1,不存在返回0
    • 获取指定集合的长度:scard key
    • 移除指定集合中一个或者多个元素:srem key member [ member2 member3 ...], 不存在的元素会被忽略,返回成功移除元素的个数
    • 随机获取指定集合中的一个[或多个]元素:srandmember key [count] (count > 0:随机获取的元素不重复;count < 0: 随机获取的元素可以重复)
    • 随机移除一个或者多个指定集合中的元素:spop key [count] (count的作用与上面相同)
    • 将指定集合中的指定元素移动到指定集合:smove source destination member(目的集合desination)
    • 获取一个指定集合中有,但是其他集合中都没有的元素组成的新集合:sdiff key key2 [key3 key4 ...] (差集)
    • 获取所有集合中都有的元素组成的新集合(交集):sinter key key2 [key3 key4 ...]
    • 获取所有集合中的元素组成的新集合(并集):sunion key key2 [key3 key4...]
  5. 有关hash类型数据的操作命令:
    • 将一个或者多个field-value对设置到哈希表中:hset key field value [field2 value2 field3 value3 ......]
    • 获取指定哈希表中指定field的值:hget key field
    • 批量获取指定哈希表中的field的值:hmget key field1 [field2 field3]
    • 获取指定哈希表中所有的field和value: hgetall key , 如:hgetall myhash
    • 从指定哈希表中删除一个或者多个field :hdel key field [field2 field3 ...]
    • 获取指定哈希表中所有的field的个数:hlen key
    • 判断指定哈希表中是否存在某一个field:hexists key field
    • 获取指定哈希表中所有的field列表:hkeys key
    • 获取指定哈希表中所有的value类表:hvals key
    • 对指定哈希表中指定的field值进行加法运算:hincrby key field int (int属性为加的数值)
    • 对指定哈希表中指定field值进行浮点数加法运算:hincrbyfloat key field float ,如:hincrbyfloat myhash score 18.8
    • 将一个field-value对设置到hash表中,如果field已经存在,则放弃设置值,否则设置该field-value对到redis中:hsetnx key field value
  6. 有关zset类型数据的操作命令:
    • 将一个或者多个member及其score值加入到指定有序集合中:zadd key score member [score2 member2 score3 member3 .....], 如:zadd myzset grade 80 math 70 english
    • 获取指定有序集合中指定下标区间的元素:zrange key start end [withscores], 返回按照score的值的大小进行排序输出
    • 获取指定有序集合中指定分数区间的元素:zrangebyscore key min max [withscores] (注:是闭区间)
    • 删除指定有序集合中一个或者多个元素:zrem key member [member2 member3 ......]
    • 获取指定有序集合中所有元素的个数:zcard key
    • 获取指定有序集合中分数在指定区间内的元素的个数:zcount key min max
    • 获取指定有序集合中指定元素的排名(排名从0开始):zrank key member
    • 获取指定有序集合中指定元素的分数:zscore key member
    • 获取指定有序集合中指定元素的排名(倒序排名):zrevrank key member

Redis配置文件

  1. redis配置文件中关于网络的配置:
    • port:指定redis服务所使用的端口号,默认使用6379,修改过后,如果再连接/断开的时候,一定要指定端口号
    • bind:配置客户端连接redis服务时,所能使用的IP地址,默认可以使用redis服务所在主机上任何一个IP都可以。一般情况下,都会配置一个IP,而且通常是一个真实的IP,而且连接/断开时也要指定IP地址
    • tcp-keepalive:TCP连接保活策略(了解即可)
  2. 常规配置
    • loglevel:配置日志级别,是根据log4j的级别进行设置的,一般开发阶段配置成debug级别的,上线阶段配置成notice或者warning级别
    • logfile:指定日志文件,redis在运行过程中,会输出一些日志信息:默认情况下,这些日志信息会输出到控制台,我们可以使用logfile配置日志文件,使redis把日志信息输出到指定文件中
    • databases:配置redis服务默认创建的数据库实例个数,默认是16个
  3. 安全配置
    • 一般情况下,只需要指导ip和端口号(port)就可以连接redis了
    • requirepass:配置redis的访问密码,默认不使用,此配置项需要在protected-mode=yes时起作用。
    • 配置了密码后,连接需要指定密码:redis-cli -h ip -p port -a password

Redis的持久化

redis提供持久化策略,在适当的时机采用适当的手段把内存中的数据持久化到磁盘中,每次redis服务启动时都可以把磁盘上的数据再次加载到内存中使用

  1. RDB:在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作
    • 默认策略:1分钟内改变了1万次 / 5分钟之内改变了15次 / 15分钟之内改变了1次(这些都是可以根据需求进行更改的)
    • save : 配置复合的快照触发条件,即Resdis在seconds秒内key改变changes次,Redis把快照内的数据保存到磁盘中一次
    • dbfilename:Redis持久化数据生成的文件名,默认是dump.rdb,可以自己配置
    • dir:Redis持久化数据生成文件保存的目录,默认是./,即redis的启动目录
  2. AOF:采用操作日志来记录进行的每一次写操作(记录写命令),每次Redis服务启动时,都会重新执行一次操作日志中的指令
    • 不是redis默认的策略,默认数RDB策略,
    • appendonly:配置是否开启AOF策略
    • appendfilename:配置操作日志文件
  3. 总结:
    • 根据数据特点决定开启哪种持久化策略,一般情况下,开启RDB(默认)就足够了

Redis的事务

它允许把一组redis命令放在一起,把命令进行序列化,然后一起执行,保证部分原子性

  1. multi:用来标记一个事务的开始。将所有的操作放入一个队列中,等待执行
  2. exec : 用来执行事务队列中的所有命令
  3. redis的事务只能保证部分原子性
    • 如果一组命令在压入事务队列中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性
    • 如果一组命令在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其他命令的执行,不能够保证事务的原子性。比如:
      multi
      set key1 value1
      incr key
      exec
      在执行第二条命令的时候会出错,但是不会影响第一条数据的执行,因此就无法保证数据的原子性了
  4. discard:清除所有已经压入队列中的命令,并且结束整个事务(不执行exec,执行discard)
  5. watch key :监控某一个key,当事务执行过程中,此key代表的值发生变化,则该事务放弃执行;否则,正常执行。
  6. unwatch:放弃监控所有watch的key

Redis消息的发布与订阅(了解)

redis客户端订阅频道,消息的发布者往频道上发布消息,所有订阅此频道的客户端都能够接收到消息

  1. subscribe:消息订阅命令,可以订阅一个或者多个频道的消息。subscribe ch1 [ch2 ch3...]
  2. publish:将消息发布到指定频道。publish ch1 hello
  3. psubcribe:订阅一个或者多个频道的消息,功能比subscribe的强大,频道名支持通配符

Redis的主从复制

主少从多,主写从读,读写分离,主写同步复制到从

  1. 搭建一主二从redis集群:
    • 使用一个redis模拟三台redis服务,只需要配置端口号不同即可实现
    • 更改port端口号、pidfile、logfile、dbfilename等配置
    • 分别使用三个配置文件启动redis服务:redis-server redis[123].conf &
    • 通过redis客户端分别连接三台redis服务:redis-cli -p 6379 (需要指定三台redis服务的端口号,从而模拟出三台redis服务)
  2. 查看三台redis服务在集群中的主从角色:默认情况下,所有的redis服务都是主机,即都可以读和写,但是都还没有从机,是独立的,互不影响
  3. 建立主从关系:
    • 设置6379为主机,不用动
    • 设置6380和6381为从机,分别执行slaveof 127.0.0.1 6379 和 slaveof 127.0.0.1 6379即可
  4. 全量复制:一旦主从关系确定,会自动把主机上已有的数据同步复制到从库.
  5. 增量复制:主库写数据会自动同步到从库,比如在6379上执行写数据,会自动同步到6380和6381从库上
  6. 在6380和6381上执行写操作时,不会执行成功,从库是只读的,不能写
  7. 当主机宕机时,从机原地待命,不影响读数据,但是数据不会更新了。当主机恢复的时候,一切恢复正常。
  8. 当从机宕机时,主机连接数减少一,其他从机不变;当从机恢复时,不会恢复其从机身份。需要重新设置主从关系,使它重新变成6379的从机。其他从机不受影响
  9. 从机上位:
    • 主机宕机、从机原地待命
    • 从机断开原来主从关系:在6380上执行slaveof no one --->变为主机
    • 重新设置主从关系:在6381上执行slaveof 127.0.0.1 6380 即可设置其从属于6380
    • 当之前的主机再恢复时,就独立于集群之外了,变成一只流浪猫了

总结:一台主机可以配置多台从机,一台从机又可以配置多台从机,从而形成一个庞大的集群结构。主要是减轻主机的压力,但是增加了服务间的延迟时间

Redis的哨兵模式

主机宕机、从机上位的自动实现

  1. 首先搭建一主二从的集群环境
  2. 提供哨兵配置文件:在redis安装目录中创建哨兵文件(redis_sentinel.conf),编辑内容为sentinel monitor dc-redis 127.0.0.1 6379 1
  3. 启动哨兵服务:redis-sentinel redis_sentinel.conf(指定配置文件)
  4. 主机宕机:哨兵程序自动选择从机上位
  5. 当之前的主机恢复后,从属于新的主机,变成从机

使用Jedis操作Redis

以前所有在命令行中对redis的操作,在jedis中都有对应的java方法,方法名都一毛一样。

posted @   蓝狐痕  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示