Redis的各种用途以及使用场景

Redis的各种用途以及使用场景Redis的各种用途以及使用场景

大家好,又见面了,我是你们的朋友全栈君。

一、为什么使用

解决应用服务器的cpu和内存压力
    减少io的读操作,减轻io的压力
    关系型数据库的扩展性不强,难以改变表结构

二、优点:

nosql数据库没有关联关系,数据结构简单,拓展表比较容易
nosql读取速度快,对较大数据处理快

三、适用场景:

数据高并发的读写
海量数据的读写
对扩展性要求高的数据

四、不适场景:

需要事务支持(非关系型数据库)
基于sql结构化查询储存,关系复杂

五、Redis结构:

Redis是一个开源的key—value型数据库,支持string、list、set、zset和hash类型数据。对这些数据的操作都是原子性的,redus为了保证效率会定期持久化数据。

六、使用场景:

配合关系型数据库做高速缓存
缓存高频次访问的数据,降低数据库io
分布式架构,做session共享
可以持久化特定数据。
利用zset类型可以存储排行榜
利用list的自然时间排序存储最新n个数据

七、Linux下redis:

redis目录:usr/local/bin
linux下redis常用命令:
redis-benchmark:性能测试工具
redis-server:启动redis服务器
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:

所需jar包:
    common-pool-1.6jar包
    jedis-2.1
获取jedis对象:Jedis jedis = new Jedis(“ip” ,端口号);

十五、集群分布:

实现对redis的水平拓展,启动n’的redis节点,将整个数据分布在这n个节点中
配置conf文件:

拷贝多个redis.conf文件
        开启daemonize yes
        Pid文件名字
        指定端口
        Log文件名字
        Dump.rdb名字
        Appendonly 关掉或者换名字

配置cluster文件:

 cluster-enable yes 打开集群模式
 cluster-config-file xxx.conf 设置生成的节点配置文件名
 cluster-node-timeout 15000设置节点失联时间,超多该时间(毫秒),集群自动进入主从切换
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106598.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 迭代器Python_Python进阶

    迭代器Python_Python进阶迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。可迭代对象我们已经知道可以对l

  • 使用reaver傻瓜式破解wifi之利用路由器WPS漏洞[通俗易懂]

    使用reaver傻瓜式破解wifi之利用路由器WPS漏洞[通俗易懂]跟这篇破解教程一样,网上破解教程多是基于路由器的WPS漏洞破解,但是这样的路由器只占少数。一般wifi是依据WPA/WPA2加密的,因此想要破解一般的wifi,还得破解这个协议,虽然近期这个协议也被破解了,不过也是很不容易的。刚入门破解,不是很熟悉,在网上找各种破解资料,终于破解成功了临近工作室的wifi,沾沾自喜~本文破解wifi针对一些路由器的WPS(Wi-fipro…

  • Linux 解压zip命令「建议收藏」

    Linux 解压zip命令「建议收藏」linux自带的unzip命令可以解压windows下的zip格式的压缩文件。unzip命令  语法:unzip[选项]压缩文件名.zip  各选项的含义分别为:  -x文件列表解压缩文件,但不包括指定的file文件。  -v查看压缩文件目录,但不解压。  -t测试文件有无损坏,但不解压。  -d目录把压缩文件解到指定目录下。  -z只显示压缩文件

  • Java课程设计[通俗易懂]

    Java课程设计[通俗易懂]#1.团队名称、团队成员##团队名称:秃头团队|成员|任务分配|||||林小强(组长)|dao包util包可视化||陈泽役|model包可视化|#2.前期

  • 简单Web应用框架设计

    简单Web应用框架设计

  • Class类 和 class对象(运行时的类型信息)

    Class类 和 class对象(运行时的类型信息)什么是类?可以理解为。class文件某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-TimeTypeIdentification),多态是基于RTTI实现的每一个类都有一个Class对…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号