写点什么

Redis 的各种用途以及使用场景 (1)

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:3172 字

    阅读完需:约 10 分钟

redis-cli:启动 redis 客户端,操作入口


八、Redis 基础知识


=========================================================================


端口:6379


默认 16 个数据库,下标从 0 开始


单线程:redis 是单线程+io 多路复用:检查文件描述的就绪状态


Memchached:多线程+锁


redis 数据类型:String set list hash zset


九、Redis 命令:


========================================================================


key 操作




keys * 查看当前库所有的键


exists <key> 判断是否存在 key


del <key> 删除某个键


expire <key> <second> 设置键过期时间 单位是 s 秒


ttl <key> 查看还有多少秒过期 -1 表示用不过期 -2 表示已经过期


move <key> <db> 把键移到另一个库下


dbsize 查看数据库 key 的数量


flushdb 清空当前库


flushall 通杀所有库


String 类型:String 是二进制安全的,可以包含任何数据源,最大 512m


get <key> 查看对应的键值


set <key> <value> 添加键值对


append <key> <value> 将给定的 value 追加到原值的末尾


strlen < key > 获取值得长度


setnx <key> <value> 当 key 不存在的时候设置 key 值


incr <key> 将 key 中储存的数字加 1,如果为空,则值为 1


decr <key> 将 key 中储存的数字减 1,如果为空,则值为-1


incrby/decrby <key> <步长> 将 key 中的数字增减


String 批量处理:




mset <key1> <value1> <key2> <value2> 同时设置多个键值对


mget <key1> <key 2> 同时获得多个值


msetnx <key1> <value1> <key2> <value2> 当给定的 key 都不存在


getrange <key> <start> <stop> 类似 sunstring


setrange <key> <start> <stop> 类似 sunstring 覆盖原始值


setex <key> <过期时间> <value> 设置键值的同时,给定过期时间


getset <key> <value> 以旧换新,设置了新的值同时得到旧值


List:链表




  • 1、特点:单键多值


Redis 列表是简单的字符串列表,从左或者从右插入


底层是双向链表,对两端的操作性能很高,通过下标查询性能很低


lpush/rpush <key> <value1> <value2> .. 从左或从右插入多个值


lpop/rpop <key> 从左边或右边吐出一个值,值光键亡


rpoplpush <key1> <key2> 从 key1 右边吐出一个值到 key2 的左边


lrange <key> <index> 按照索引下标获取元素 从左到右


lindex <key> <index> 按照索引下标获取元素 从左到右


llen <key> 获取列表长度 获取列表长度


linsert <key> before <value> <newvalue> 在 key 中 value 前插入 newvalue


Set:类似 list 的无序集合,保证列表中不会有重复数据,底层是一个 value 为 null 的 hash 表


sadd <key> <value1> <value2> 将多个元素加入到 key 中,重复值忽略


smembers <key> 取出该集合的所有值


sismember <key> <value> 判断集合 key 中是否有该 value 值 有就 1 没有 0


scard <key> 返回该集合的元素个数


srem <key> <value1> <value2> 删除集合中的某个元素


spop <key> 随机吐出该集合一个值


srandmember <key> <n> 随机从集合中取出 n 个值,不会从集合中删除


smove <key1> <key2> <value> 将 key1 中的 value 移动到 key2 中


sinter <key1> <key2> 返回两个集合的交集元素


sunion <key1> <key2> 返回两个集合的并集


hash:键值对集合,类似 map<String,Object>


hset <key> <filed> <value> 给 key 集合中的 file 键赋值 value


hget <key1> <field> 从 key1 集合 file 取出 value


hmset <key1> <field1> <value1> <field2> <value2> 批量设置 hash 的值


hexists <key> <field> 查看 key 中的 field 是否存在


hkeys <key> 列出 key 中所有的 filed


hvals <key> 列出该 hash 集合中所有的 value


zset:与 set 集合非常相似,每个成员都关联了 score,可以用来排序


zadd<key><score1><value1><score2><value2> 将一个或多个元素以及 score 加入 zset


zrange<key><start><stop> withscore 返回下标在区间内的集合,带有 score


zrangebyscore <ket> <min> <max>[withscore] [limit offset count] 返回 key 中 score 介于 min 和 max 中的成员,升序排列


zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count] 降序


zincrby <key> <increment> <value> 在 key 集合中的 value 上增加 increment


zrem <key> <value> 删除 key 集合下的指定元素


zcount <key> <min><max> 统计 区间内的元素个数


zcord <key> 获取集合中的元素个数


zrank <key><value> 查询 value 在 key 中的排名,从 0 开始


十、redis 持久化:


=========================================================================


两种方式:rdb(redis database)和 aof(append of file)


RDB:在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取 snapshot 文件到内存中


  • ①持久化过程:redis 单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比 aof 高效,但是最后一次数据可能会丢失

  • ②Fork:在 linux 中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程

  • ③Redis 备份的文件:在 redis.conf 中设置,dbfilename 默认为:dump.rdb

  • ④ Rdb 保存策略:


900s 1 file change


300s 10file change


60s 10000file change


  • ⑤Rdb 的备份:


config get dir 得到备份的文件夹


复制备份文件


  • ⑥Rdb 恢复:


关闭 redis


将备份文件复制到工作目录下


启动 redis,自动加载


  • AOF : 以日志形式记录每个写操作,启动时通过日志恢复操作


开启 AOF:默认不开启,进入 redis.conf 找到 appendonly yes 打开


修复 AOF:redis-check-aof –fix appendonly.aof


同步频率:每秒记录一次,如果宕机该秒记可能失效


Rewrite:bgrewriteaof 因为日志是追加方式,文件会越来越大,当超过了设置的阈值时,日志文件会压缩,保留仅可以恢复的日志


RDB 和 AOF 对比


节省磁盘空间


恢复速度快


RDB 优点:


ROD 缺点:


数据太大时,比较消耗性能


一段时间保存一次快照,宕机时最后一次可能没有保存


c) AOF 优点:


i. 备份机制更加稳健


ii. 可读的日志文件,通过 aof 恢复更加稳健,可以处理失


d) AOF 缺点:


RDB 和 AOF 哪个好


官方推荐都启用


对数据不敏感,单独用 RDB


不建议单独使用 AOF


若作为纯缓存使用,可以都不开启


十一、Redis 事务


========================================================================


输入 multi,输入的命令都会依次进入到队列中,但不会执行,直到输入 exec,redis 会将之前命令队列中的命令依次执行,通过 discard 可以放弃组队。


  • 主要作用:序列化操作,串联多个命令防止别的命令插队

  • 悲观锁:每次拿到数据的时候都会上锁,或者等待别人处理完再去拿锁,传统的关系型数据库里边很多用到了这种锁机制,比如行锁、表锁、读锁、写锁

  • 乐观锁:每次拿数据的时候总认为别人不会修改数据,所以不会上锁。但是更新的时候回去判断别人有没有更改数据,使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。


Redis 使用乐观锁:redis 就是利用 check-and-set 机制实现事务


  • 三大特性:


单独的隔离操作:


事务中的所有命令都会序列化,按顺序执行。不会被其他客户端打断


没有隔离级别概念:队列中的命令没有提交之前不会被执行,事务外不能查看事务内的更新


不能保证原子性:跳过错误,依旧执行,没有回滚


十二、Redis 订阅/发布:


============================================================================


是进程中的一种消息通信模式,发送者 pub 发送消息,订阅者 sub 接收消息 剩下的略。。。


十三、Redis 主从复制:


===========================================================================


是什么:主从复制就是主机数据更新后根据配置和策略,自动同步到备份机的 master/slaver 机制,master 写为主,slave 读为主


用处:


读写分离,性能拓展。


容灾快速恢复


配置服务器(配从不配主):


拷贝多个 redis.conf 文件


开启 daemonize yes


Pid 文件名字


指定端口


Log 文件名字


Dump.rdb 名字


Appendonly 关掉或者换名字


十四、Jedis:

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Redis的各种用途以及使用场景(1)