主流中间件--Redis

NOSQL

什么是NOSQL

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。

关系型数据库:以关系(由行和列组成的二维表)模型建模的数据库。简单理解:有表的就是关系型数据库。

NOSQL分类

 

Redis

什么是Redis

Redis 是一个高性能的 开源的、C语言写的Nosql(非关系型数据库),redis的数据可以存储在内存中或者磁盘中。Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合

数据结构:数组、List Set Map等

Redis是将数据保存到内存的nosql。它有很多的方法,使用特定的方法就可以将存入的字符串转化为特定的数据结构保存。

Redis的特点
  • 数据保存在内存,存取速度快,并发能力强

  • 它支持存储的value类型相对更多,包括string(字符串)、list(链表-有序可重复集合)、set(无序不可重复集合)、 zset(sorted set --有序不可重复集合)和hash(哈希类型-对象)。

  • redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。

  • 提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便。

  • Redis支持集群(主从同步)。数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。

  • 支持持久化,[redis数据存储在内存中,也可以存储在磁盘上面]

  • 支持订阅/发布[有专业的订阅与发布的中间件 MQ]

总结:

1、redis是C语言写的开源免费的NoSql数据库

2、数据存放在内存,还支持持久化。存取数据快,并发能力强,数据安全高。

3、value支持的数据类型多。

4、支持多个语言客户端。

5、支持集群。(支持高并发,海量数据)

Redis、Memcached、Mysql的比较
mysqlredismemcached
类型关系型非关系型非关系型
存储位置磁盘磁盘和内存内存
存储过期不支持支持支持
读写性能非常高非常高
Redis的使用场景
  • 缓存

    经常查询数据,放到读速度很快的空间(内存),以便下次访问减少时间。减轻数据库压力,减少访问时间.而redis就是存放在内存中的。就如同:Mybatis 二级缓存 , ehcache框架 缓存。

  • 计数器

    网站通常需要统计注册用户数,网站总浏览次数等等 ,新浪微博转发数、点赞数。

    upd xxx set ckickcount=ckickcount+1 where id =?

    upd xxx set ckickcount=ckickcount-1 where id =?

  • 实时防攻击系统

    防止暴力破解,如使用工具不间断尝试各种密码进行登录。解决方案使用Redis记录某ip一秒访问到达10次以后自动锁定IP,30分钟后解锁

  • 设定有效期的应用

    设定一个数据,到一定的时间失效。验证码,登录过期, 自动解锁,购物券,红包。

  • 自动去重应用

    Uniq 操作,获取某段时间所有数据排重值 这个使用 Redis 的 set 数据结构最合适了,只需要不断地将数据往 set 中扔就行了,set 意为 集合,所以会自动排重。

  • 排行榜 可以利用redis的zset来进行处理

  • 队列

    构建队列系统 使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。

    秒杀:可以把名额放到内存队列(redis),内存就能处理高并发访问。

  • 消息订阅系统:

    Pub/Sub 构建实时消息系统 Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统 的例子.

Redis启动和测试

启动redis-server

进入到Redis安装目录 ,虽然双击也可以启动,但是建议使用CMD执行

redis-server.exe redis.windows.conf
启动redis-client
  • 连接本机Redis直接双击 redis-cli.exe 或者执行命令

redis-cli.exe
  • 如果连接其他服务的Redis需要跟上 -h参数

redis-cli.exe -h ip -p 端口   #如  redis-client.exe -h 192.168.0.11 -p 6379
测试Redis
set name zs #设置数据
​
get name    #获取数字
​
expire name 30  # 设置过期时间
​
ttl name  #获取过期时间
​
keys *  # 获取所有的key
设置密码
临时设置
  • CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效

config set requirepass 123456
永久设置
  • 修改配置文件 redis.widows.conf ,增加代码:

requirepass 123456
登录
auth 123456

Redis命令

String的操作

String结构
  • String结构模拟图

keyvalue
namezs
age18
set key value
  • 将单个字符串值value关联到key,存储到Redis

set name zs         #key为 name, 值为zs 
get key
  • 返回key关联的字符串值

get name            #获取值,key为 name
mset key value key value
  • 同时设置一个或多个 key-value 对

mset name zs age 18     #设置了两对key ,name=zs ; age=18
mget key key
  • 获取多个值

mget name age       #获取key为name和age的数据的值
incr key
  • 将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)

incr age        #age的值增加1
decr key
  • 将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)

decr age        #将age的值减去1
incrby key number
  • 将 key 中储存的数字值增加指定数字

incrby age  2       #在age的值的基础上增加2  
decrby key number
  • 将 key 中储存的数字值减少指定数字

decrby age  2       #在age的值的基础上减去2  
SETEX key seconds value
  • 设置key-value,并设置过期时间

setex mykey 10 "Hello"  #设置 mykey的值为“hello” ,过期时间为 10s ,是set和expire的组合命令,且是原子性的
SETNX key value
  • 设置一个key-value,如果这个key不存在则设置成功返回1,否则设置不成功,返回0

setnx name zs
GETSET key value
  • 设置一个key-value,把这个key以前的值返回

getset name ls

key的操作

keys
  • 查看所有的key

keys *
​
通配符 * 代表0-多个  ?代表一个字符
del key
  • 删除指定的某个key

del username    #删除key为username的数据
expire key secnods
  • 设置key的过期时间(secnods秒后过期)

expire name 10  #设置name的过期时间10s
ttl key
  • 查看key的过期时间

ttl name        #查看name的过期时间
flushall
  • 清空整个redis服务器数据,所有的数据库全部清空

flushall
flushdb
  • 清除当前库

flushdb
select index
  • 选择数据库,redis中默认有16个数据库,名称分别为0,1,2,,,15 , index数据库索引

select 1        #选择第2个数据库
exists key
  • 查询key是否存在

exists name

List的操作

List结构

list集合可以看成是一个左右排列的队列(列表)

  • List机构模拟图

    keyvaluevaluevalue
    nameszslsls
    ages111820
lpush key value value
  • 将一个或多个值 value 插入到列表 key 的表头(最左边)

lpush names zs ls   #往key为 names 的list左边添加值“zs”和“ls”
lrange key start stop
  • 返回列表 key 中指定区间内的元素,查询所有的stop为-1即可

lrange names 0 -1       #查看names的所有元素
rpush key value value
  • 将一个或多个值 value 插入到列表 key 的表尾(最右边)

rpush names zl cq   #往key为 names 的list右边添加值“zl”和“cq”
lpop key
  • 移除并返回列表 key 的头(最左边)元素。

lpop names  #移除并返回names列表的头(最左边)元素
rpop key
  • 移除并返回列表 key 的尾(最右边)元素。

rpop names  #移除并返回names列表的尾(最右边)元素。
lrem key count value
  • 根据count值移除列表key中与参数 value 相等的元素count >0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。

lrem names 1 zs     #删除names列表中左边第1个“zs” 
lrem names 0 ls     #删除names列表中所有的“ls”
lrem names -1 cq    #删除names列表中右边第1个“cq”
lindex key index
  • 返回列表 key 中,下标为 index 的元素

lindex names 2  #取names列表中索引为 2 的元素
ltrim key start stop
  • 对一个列表进行修剪 ,保留范围内的,范围外的删除

ltrim names 2 4     #删除names列表中索引为 2 - 4 以外的元素
Redis中如何实现栈和队列
  • list控制同一边进,同一边出就是栈

  • list控制一边进,另一边出就是队列

Set的操作

set集合是一个无序的不含重复值的队列

Set结构
  • Set机构模拟图

keyvaluevaluevalue
idcards110120130
phones182135136
sadd key value value
  • 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

sadd colors red green yellow blue       #往colors这个set集合中存放元素: red,green,yellow,blue
smembers key
  • 返回集合 key 中的所有成员。

smembers colors
srem key member
  • 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略

srem colors red     #删除colors中的 red元素
SCARD key
  • 返回集合存储的key的基数 (集合元素的数量).如果key不存在,则返回 0。

scard colors
SDIFF key [key ...]
  • 返回一个集合与给定集合的差集的元素

sdiff colors names
SISMEMBER key member
  • 返回成员 member 是否是存储的集合 key的成员.

  • 如果member元素是集合key的成员,则返回1

  • 如果member元素不是key的成员,或者集合key不存在,则返回0

sismember names zs      #判断names中是否包含 zs

ZSet的操作

ZSet(sorted sets)在Set基础上增加了“分数”,让set集合有了排序功能

ZSet结构
  • ZSet结构模拟图

keyvalue(score)value(score)value(score)
nameszs(10)ls(20)ww(30)
zadd key score value score value
  • 将所有指定成员添加到键为key有序集合(sorted set)里面,如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置

zadd heights   150 zs 160 ls        #有序集合heights中zs的分数为150 ,ls的分数是 160
ZCARD key
  • 返回key的有序集元素个数。key存在的时候,返回有序集的元素个数,否则返回0。

zcard heights
ZCOUNT key min max
  • 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。

zcount heights 150 160      #获取heignhts中分数为 150到160的元素数量
ZPOPMAX key [count]
  • 删除并返回有序集合key中的最多count个具有最高得分的成员。如未指定,count的默认值为1。

zpopmax heights 2           #删除最高分数的前2个元素
ZPOPMIN key [count]
  • 删除并返回有序集合key中的最多count个具有最低得分的成员。如未指定,count的默认值为1。

zpopmin heights 2       #删除最低分数的前2个元素
ZRANGE key start stop [WITHSCORES]
  • 返回存储在有序集合key中的指定范围的元素。 返回的元素可以认为是按得分从最低到最高排列。 如果得分相同,将按字典排序。返回给定范围内的元素列表(如果指定了WITHSCORES选项,将同时返回它们的得分)。

zrange heights 0 10 WITHSCORES  #返回heights中索引 0 到 10 的元素和其分数
ZRANK key member
  • 返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。排名以0为底,也就是说,score值最小的成员排名为0。

zrank heights zs    #返回 zs在heights的分数从小到大排名
ZREVRANK key member
  • 返回有序集key中成员member的排名,其中有序集成员按score值从大到小排列。排名以0为底,也就是说,score值最大的成员排名为0。

zreverank heights zs    #返回 zs在heights的分数从大到小排名
ZSCORE key member
  • 返回有序集key中,成员member的score值。如果member元素不是有序集key的成员,或key不存在,返回nil。

zscore heights zs       #返回 zs的分数
ZREVRANGE key start stop [WITHSCORES]
  • 返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。具有相同score值的成员按字典序的反序排列。

ZREVRANGE heights 1 2   WITHSCORES      #返回索引1 - 2 的成员,按分数大到小排序
ZRANGEBYSCORE key min max WITHSCORES LIMIT offset count
  • 返回有序集合中指定分数区间内的成员,分数由低到高排序,LIMIT控制分页

ZRANGEBYSCOREkey heights 0 170 WITHSCORES LIMIT 0 10    #查询heights中0-170分之间的元素,低到高排序,0条                                                        #开始查询,每页10条
ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count
  • 返回有序集合中指定分数区间内的成员,分数由高到低排序,LIMIT控制分页

指令是否必须说明
ZREVRANGEBYSCORE指令
key有序集合键名称
max最大分数值,可使用"+inf"代替
min最小分数值,可使用"-inf"代替
WITHSCORES将成员分数一并返回
LIMIT返回结果是否分页,指令中包含LIMIT后offset、count必须输入
offset返回结果起始位置
count返回结果数量
ZREVRANGEBYSCORE heights 170 0 WITHSCORES LIMIT 0 10    #返回heights中分数为170-0之间从第0条数查,10条

Hash的操作

Hash类似于jdk中的Map,一个key下面以键值对的方式存储数据

Hash结构
  • Hash机构模拟图

6.2.HSET key field value
  • 设置 key 指定的哈希集中指定字段的值。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段在哈希集中存在,它将被重写。

hset user:1 name zs         #给"user:1"这个key设置name=zs键值对
6.3.HGet key name
  • 获取hash类型的name键对应的值

hget user:1 name    #获取user:1总的name字段
6.4.HMSET key field value field value
  • 批量添加name=value键值对到key这个hash类型

hmset user:2 name zs age 18     #给"user:2"这个key设置name=zs键值对和age=18键值对
6.5.HMGET key field field
  • 批量获取hash类型的键对应的值

hmget user:2 name age   #获取user:2总的name和age字段
6.6.hkeys key
  • 返回哈希表 key 中的所有键

hkeys user:2    #返回user:2总的所有字段
6.7.hvals key
  • 返回哈希表 key 中的所有值

hvals user:2    #返回user:2中的所有值
6.8.hgetall key
  • 返回哈希表 key 中,所有的键和值

hgetall user:2  #返回user:2中所有key和value
6.9.存储对象的两种方式
  • 使用string结构

set user:1 {id:1,name:zs}
  • 使用hash

hset user:2 {id:2,name:ls}

写在最后:redis是当前主流的中间件,后续还会分享更多文章,笔者小,中,大厂均有面试经验,坚持每日分享java全栈知识,希望能够与大家共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内容安全复习 7 - 对抗攻击与防御

文章目录 概述攻击对抗性攻击的目的攻击的损失函数如何攻击FGSM黑盒与白盒真实世界的攻击 防御被动防御主动防御 概述 动机 &#xff08;1&#xff09;不仅要在实验室中部署机器学习分类器&#xff0c;也要在现实世界中部署&#xff1b;实际应用 &#xff08;2&#xff09;分类…

【数据结构】线性表之《栈》超详细实现

栈 一.栈的概念及结构二.顺序栈与链栈1.顺序栈2.链栈1.单链表栈2.双链表栈 三.顺序栈的实现1.栈的初始化2.检查栈的容量3.入栈4.出栈5.获取栈顶元素6.栈的大小7.栈的判空8.栈的清空9.栈的销毁 四.模块化源代码1.Stack.h2.Stack.c3.test.c 一.栈的概念及结构 栈&#xff1a;一种…

程序猿成长之路之数据挖掘篇——决策树分类算法(1)——信息熵和信息增益

决策树不仅在人工智能领域发挥着他的作用&#xff0c;而且在数据挖掘中也在分类领域中独占鳌头。了解决策树的思想是学习数据挖掘中的分类算法的关键&#xff0c;也是学习分类算法的基础。 什么是决策树 用术语来说&#xff0c;决策树&#xff08;Decision Tree&#xff09;是…

Go自定义数据的序列化流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

数据库设计概述-数据库设计内容、数据库设计方法(基于E-R模型的规范设计方法)

一、引言 如何利用关系数据库理论设计一个满足应用系统需求的数据库 二、数据库设计内容 1、数据库设计是基于应用系统需求分析中对数据的需求&#xff0c;解决数据的抽象、数据的表达和数据的存储结构等问题 2、其目标是设计出一个满足应用要求、简洁、高效、规范合理的数…

Map集合之HashMap细说

最近在看面试题&#xff0c;看到了hashmap相关的知识&#xff0c;面试中问的也挺多的&#xff0c;然后我这里记录下来&#xff0c;供大家学习。 Hashmap为什么线程不安全 jdk 1.7中&#xff0c;在扩容的时候因为使用头插法导致链表需要倒转&#xff0c;从而可能出现循环链表问…

航行在水域:使用数据湖构建生产级 RAG 应用程序

在 2024 年年中&#xff0c;创建一个令人印象深刻和兴奋的 AI 演示可能很容易。需要一个强大的开发人员&#xff0c;一些聪明的提示实验&#xff0c;以及一些对强大基础模型的API调用&#xff0c;你通常可以在一个下午建立一个定制的AI机器人。添加一个像 langchain 或 llamain…

c++ 内存分析模型、引用

一、内存模型分区 内存四区的意义&#xff1a; 不同区域存放的数据&#xff0c;赋予不同的生命周期&#xff0c;给我们更大的灵活编程 &#xff08;一&#xff09;程序运行前 在程序编译后&#xff0c;生成了exe可执行程序&#xff0c;未执行程序前分为两个区域 代码区&…

SpringMVC系列七: 手动实现SpringMVC底层机制-上

手动实现SpringMVC底层机制 博客的技术栈分析 &#x1f6e0;️具体实现细节总结 &#x1f41f;准备工作&#x1f34d;搭建SpringMVC底层机制开发环境 实现任务阶段一&#x1f34d;开发ZzwDispatcherServlet&#x1f966;说明: 编写ZzwDispatcherServlet充当原生的DispatcherSer…

码云建仓库

1.新建仓库 码云地址 打开 码云地址 &#xff0c;点击“”&#xff0c;新建仓库&#xff0c;添加仓库内容 &#xff0c;创建。 小提示&#xff1a;如果本地已有项目&#xff0c;就不要选初始化&#xff0c;设置模板&#xff0c;容易冲突。 2. 进入当前仓库页 小提示&#x…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的巡演(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

心明眼亮 洞悉万物

如何洞悉事物的本质呢&#xff1f; 阳明先生&#xff1a;世间之事&#xff0c;纷繁复杂&#xff0c;不可能一一研究得过来。 圣人只需要把内心的明镜擦亮&#xff0c;而无需担心外部的事事物物在镜子中如何映照。 —— 外界事物是无穷无尽的&#xff0c;永远探究不完&#xf…

30 - 每位经理的下属员工数量(高频 SQL 50 题基础版)

30 - 每位经理的下属员工数量 -- 根据reports_to &#xff0c;获取employee_id,即分组用e1.reports_to&#xff0c;查询用e2.employee_id,e2.nameselect e2.employee_id,e2.name ,count(e1.reports_to) reports_count,round(avg(e1.age),0) average_age from Employees e1 left…

【鸿蒙踩坑记录】解决:list组件滑动至左边或右边,回弹效果过大问题

一、问题描述 开发过程中使用List组件&#xff0c;当内容超过一屏时可出现滚动效果&#xff0c;此时按住内容迅速滑动至左边&#xff0c;或者滑动到右边&#xff0c;回弹效果过大 期望&#xff1a;滑动时&#xff0c;不要有那么大的回弹效果 二、目前效果 三、解决方法 3.1…

go语言day03

目录 一、 go语言的数据类型&#xff1a; 二、声明赋值的简写形式&#xff1a; ":" 1&#xff09;重复使用的编译错误 2&#xff09;在全局变量中使用 : 会报编译错误 三、变量规则&#xff1a; 0&#xff09;变量的命名规则&#xff1a; 1&#xff09;创建的局部…

丰臣秀吉-读书笔记六

登山的目标必然是山顶。但人生的乐趣和生息的快乐却不在山顶&#xff0c;相反可以说是在山中的逆境之处。当我们遇上峡谷、绝壁、溪流、断崖、雪崩之类的险路时&#xff0c;心里虽想着已经不行了等&#xff0c;却不甘就此罢手而不与面前的艰难险阻战斗。而当我们完美克服并跨越…

用 Rust 实现一个替代 WebSocket 的协议

很久之前我就对websocket颇有微词&#xff0c;它的确满足了很多情境下的需求&#xff0c;但是仍然有不少问题。对我来说&#xff0c;最大的一个问题是websocket的数据是明文传输的&#xff0c;这使得websocket的数据很容易遭到劫持和攻击。同时&#xff0c;WebSocket继承自HTTP…

Spark SQL 血缘解析方案

背景 项目背景建设数据中台,往往数据开发人员首先需要能够通过有效的途径检索到所需要的数据,然后根据检索的数据模型进行业务加工然后得到一些中间模型,最后再通过数据抽取工具或者OLAP分析工具直接将数据仓库中加工好的公共模型输出到应用层。这里我不在去介绍数据仓库为…

Mysql8死锁排查

Mysql8死锁排查 Mysql8 查询死锁的表 -- 查询死锁表select * from performance_schema.data_locks;-- 查询死锁等待时间select * from performance_schema.data_lock_waits;Mysql8之前的版本 查询死锁的表 -- 查询死锁表SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;-- 查询…

Virtualbox主机和虚拟机之间文件夹共享及双向拷贝

在VirtualBox这样的虚拟化环境中&#xff0c;实现主机与虚拟机之间的文件夹共享与双向文件传输是一个常见的需求。下面&#xff0c;我们将详细讲解如何在VirtualBox中实现这一功能。 一、安装与准备 首先&#xff0c;确保你已经安装了VirtualBox&#xff0c;并在其上成功创建…