admin管理员组文章数量:1647017
文章目录
- 1、Redis 入门
- 1.1、问题引入
- 1.2、NoSQL简介
- 1.3、NoSQL的四大分类
- 1.4、现实电商的解决方案
- 1.5、Redis简介
- 1.6、Redis的应用
- 1.7、Redis的下载与安装
- 1.8、Redis的基本基本操作
- 2、Redis数据类型
- 2.1、string
- 1、string类型的数据的基本操作
- 2、string类型的数据的扩展操作
- 3、string数据类型操作的注意事项
- 2.2、hash
- 1、hash 类型数据基本操作
- 2、hash 类型数据扩展操作
- 3、hash数据类型操作的注意事项
- 2.3、list
- 1、list 类型数据基本操作
- 2、list 类型数据扩展操作
- 3、list 类型数据操作注意事项
- 2.4、set
- 1、set 类型数据的基本操作
- 2、set 类型数据的扩展操作
- 3、set 类型数据操作的注意事项
- 2.5、sorted_set
- 1、sorted_set 类型数据的基本操作
- 2、sorted_set 类型数据的扩展操作
- 3、sorted_set 类型数据操作的注意事项
- 3、通用指令
- 3.1、key通用指令
- 1、key 基本操作
- 2、key 扩展操作(时效性控制)
- 3、key 扩展操作(查询模式)
- 4、key 其他操作
- 3.2、数据库通用指令
- 1、db基本操作
- 2、db相关操作
- 3、演示案例
1、Redis 入门
1.1、问题引入
在传统的 Java Web 项目中,使用数据库进行存储数据,但是有 些致命的弊端,这些弊端主要来自于性能方面。由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,般管理系统上,由于不存在高并发,因此往往没有瞬间需要读/写大量数据的要求,这个时候使用数据库进行读/写是没有太大的问题的,但是在互联网中,往往存在大数据量的需求 ,比如一些商品抢购的场景,或者是主页访问量瞬间较大的时候, 瞬间成千上万的请求就会到来 需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务岩机的严重生产问题。
1.2、NoSQL简介
为了克服这些问题, Java Web 项目往往就引入了 NoSQL 技术, NoSQL 工具也是简易的数据库,它主要是 种基于内存的数据库,并提供 定的持久化功能 RedisMongoDB 是当前使用最广泛的 NoSQL ,而本书主要介绍的是 Redis 技术,它的性能十分优越,可以支持每秒十几万次的读/写操作,其性能远超数据库,并且支持集群、 分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,而更让我们感到欣喜的是它还能支持一定的事务能力,这在高并发访问的场景下保证数据安全和一致性特别有用。
什么是NoSQL呢?
NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
- 可扩容,可伸缩
- 大数据量下高性能
- 灵活的数据模型
- 高可用
常见 Nosql 数据库:
- Redis
- memcache
- HBase
- MongoDB
1.3、NoSQL的四大分类
KV键值对
- 新浪:Redis
- 美团:Redis + Tair
- 阿里、百度: Redis + memecache
文档型数据库(bson格式和json格式一样)
- MongoDB
- MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用于处理大量的文档
- MongoDB是一个介于关系型数据库和非关系型数据库中间的产品!MongoDB是非关系型数据库中功能最丰富的,最想关系型数据库的
- ConthDB
列存储数据库
- HBase
- 分布式文件系统
图关系数据库
- 不是图形,存放的是关系。比如朋友圈的社交网络,广告推荐
- Neo4j、InfoGrid
分类 | 举例 | 应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
1.4、现实电商的解决方案
MySQL用来解决最终的底层存储,上层的存储采用NoSQL
1.5、Redis简介
Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
-
数据间没有必然的关联关系
-
内部采用单线程机制进行工作
-
高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
-
多数据类型支持
- 字符串类型 string
- 列表类型 list
- 散列类型 hash
- 集合类型 set
- 有序集合类型 sorted_set
-
持久化支持。可以进行数据灾难恢复
1.6、Redis的应用
- 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
- 任务队列,如秒杀、抢购、购票排队等
- 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
- 时效性信息控制,如验证码控制、投票控制等
- 分布式数据共享,如分布式集群架构中的 session 分离
- 消息队列
- 分布式锁
1.7、Redis的下载与安装
由于作者希望使用redis的场景是在linux下,所以win版本很早就停跟了。且Redis基础部分我也会基于win进行实验测试
win版本:https://github/microsoftarchive/redis/releases/tag/win-3.2.100
不过下载的速度堪忧
下载后解压即可使用
使用时先启动服务端,再启动客户端
下图为启动成功后的图示
1.8、Redis的基本基本操作
我们可以将Redis的命令分为四种类型
1、功能性命令
信息的添加:
- 添加信息:set key value
- 查询信息:get key
当访问的信息不存在时,返回nil
2、清楚屏幕信息
- 清除屏幕信息:clear
3、帮助信息查阅
- 查看帮助文档:help 命令名称、help @组名
4、退出命令
- 退出客户端:quti、exit、esc
对于set和mset的比较
- set为发送单指令,mset为发送多指令
- 对于使用set发送三条数据,假设发送时间和返回的时间相同,则消耗时间为:3*2*发送时间+3*执行时间
- 对于使用mset发送三填数据,假设发送时间和返回的时间相同,则消耗时间为:1*2*发送时间+3*执行时间
- 对于两个指令的具体使用,没有明确的限定,需要具体情况具体分析(因为如果mset一次性数据太多,由于处理时间太长,容易造成网络阻塞)
2、Redis数据类型
我们要明确Redis的出现,是为了高并发,秒杀等业务场景而生,所以在类似的业务场景下都可以的使用Redis
redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储。数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
Redis种的常用的数据类型可以分成五类
- sting
- hash
- list
- set
- sorted_set
我们可以把这五种类型,简单的类比为java种的String、HashMap、LinkedList、HashSet、TreeSet
2.1、string
1、string类型的数据的基本操作
1)添加/修改数据
set key value
2)获取数据
get key
3)删除数据
del key
4)添加/修改多个数据
mset key1 value1 key2 value2
5)获取多个数据
mget key1 key2
6)获取数据字符串的个数(字符串的长度)
strlen key
7)追加信息到院士数据候补(如果原始信息存在就追加,不存在就新建)
append key value
2、string类型的数据的扩展操作
由于在大型的企业级应用中,一次性操作一整张的表格服务器的压力会很大。所以我们就需要进行分表。由于Redis中全部是以key value的形式存储,所以就无法出现像关系型数据库一样的自带主键属性。那怎么办呢?
于是Redis中便给出了关于主键得关键字。
设置数值数据增加指定范围的值
incr key //key对应的value只能是数字型的,每次增加1,如果是字符串型则会报错
incrby key increment //increment为key对应value的增加量,但是最大不能超过java中long的范围,且只能增加整数,增加小数会报错
incrbyfloat key increment //与上例类似,只不过增加的形式为小数。当然它也可以增加整数量
设置数值数据减少指定范围的值
decr key //与增加类似。每次减少1
decrby key increment //每次减少对应的范围值,且减少量为整数
虽然我们这里看似增加减少的是一个数值,但是其实对应的value值,依然是string类型
设置数据具有指定的生命周期
setex key seconds value //设置时间的有效期,单位为秒
psetex key milliseconds value //设置时间的有效期,单位为毫秒
3、string数据类型操作的注意事项
1)数据操作不成功的反馈与数据正常操作之间的差异
① 表示运行结果是否成功
-
(integer) 0 → false 失败
-
(integer) 1 → true 成功
② 表示运行结果值
-
(integer) 3 → 3 3个
-
(integer) 1 → 1 1个
2)数据未获取到
(nil)等同于null
3)数据最大存储量
512MB
4)数值计算最大范围(java中的long的最大值)
9223372036854775807
在实际的应用场景中,我们的key一般格式为
表名:主键名:主键值:字段名 value
tb:id:1:name mobian
tb:id:2:name:2mobian2
对于其字段名和value值也可以使用JSON字符串的形式存储
tb:id:1 {“name”:“mobian”,“age”:21}
2.2、hash
key value => key field+value
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
- 需要的存储结构:一个存储空间保存多个键值对数据
- hash类型:底层使用哈希表结构实现数据存储
hash存储结构优化
- 如果field数量较少,存储结构优化为类数组结构
- 如果field数量较多,存储结构使用HashMap结构
1、hash 类型数据基本操作
1)添加/修改数据
hset key field value
2)获取数据
hget key field
hgetall key
3)删除数据
hdel key field1 [field2]
4)添加/修改多个数据
hmset key field1 value1 field2 value2
5)获取多个数据
hmget key field1 field2
6)获取哈希表中字段的数量
hlen key
7)获取哈希表中是否存在指定的字段
hexists key field
2、hash 类型数据扩展操作
1)获取哈希表中所有的字段名或字段值
hkeys key //获取value的前半部分
hvals key //获取value的后半部分
2)设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
仅仅用hash就可以完成部分购物车、抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
3、hash数据类型操作的注意事项
-
hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
-
每个 hash 可以存储 2的32次方 - 1 个键值对
-
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
-
hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
2.3、list
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
- 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
- list类型:保存多个数据,底层使用双向链表存储结构实现(两边都可以进,两边都可以出)
1、list 类型数据基本操作
将list想象成一根水管,左边添加数据,就往水管左边放数据,右边添加数据,就往水管右边放数据,记住一次只能放一个
1)添加/修改数据
lpush key value1 [value2] //left进行插入数据
rpush key value1 [value2] //right进行插入数据
2)获取数据
lrange key start stop //根据对应的索引进行查询数据(0 -1可以组合使用查看所有索引数据)
lindex key index //获取指定的
llen key //获取key的长度
3)获取并移除数据
lpop key //从左边弹出数据
rpop key //从右边弹出数据
2、list 类型数据扩展操作
1)规定时间内获取并移除数据
blpop key1 [key2] timeout //在一定时间内,获取key中的数据
brpop key1 [key2] timeout //在一定时间内,移除key中的数据
2)移除指定数据
lrem key count value //移除对应key的一定数量的value
3、list 类型数据操作注意事项
- list中保存的数据都是string类型的,数据总容量是有限的,最多2的三十二次方 - 1 个元素 (4294967295)。
- list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
- 获取全部数据操作结束索引设置为-1
- list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
list可以让redis用于服务器日志的顺序输出、热点新闻,以及关注好友的顺序的实际应用中
模拟三台不同的服务器将日志进行集中输出的场景:
2.4、set
- 新的存储需求:存储大量的数据,在查询方面提供更高的效率
- 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
- set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
1、set 类型数据的基本操作
1)添加数据
sadd key member1 [member2]
2)获取全部的数据
smembers key
3)删除数据
srem key member1 [member2]
4)获取集合数据总量
scard key
5)判断集合中是否包含指定的元素
sismember key member
2、set 类型数据的扩展操作
1)随机获取集合中指定数量的数据
srandmember key [count]
2)随机获取集合中的某个数据并将该数据移出集合
spop key [count]
3)求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
4)求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
5)将指定数据从原始集合中移动到目标集合中
smove source destination member
3、set 类型数据操作的注意事项
- set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
- set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间
redis对比于提供基础数据还是校验结果,前者耦合度更低,推荐使用
2.5、sorted_set
1、sorted_set 类型数据的基本操作
1)添加数据
zadd key scorel member1 [score2 member2]
2)获取全部数据
zrange key start stop [withcores]
zrevrange key start stop [withcores]
3)删除数据
zrem key member [member ...]
4)按条件获取数据
zrangebyscore key min max [withcores] [LIMIT] //用于查询指定范围的score,再按照分页显示
zrevrangebyscore key max min [withcores]
5)条件删除数据
zremrangebyrank key start stop //按照指定的索引删除数据
zremrangebyscore key min max
注意:
- min与max用于限定搜索查询的条件
- start与stop用于限定查询范围,作用于索引,表示开始和结束索引
- offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
6)获取集合数据总量
zcard key //获取集合数据总量
zcount key min max //获取指定范围内的数量
7)集合交、并操作
zinterstore destination numkeys key [key ...] //该指定操作可以获取最大值、合并相同set集合的数据....可以使用help命令查看全部使用
zunionstore destination numkeys key [key ...]
2、sorted_set 类型数据的扩展操作
1)获取数据对应的索引(排名)
zrank key member //根据key查询出对应的索引值(从小到大)
zrevrank key member
2)score值获取与修改
zscore key member //根据key查询其对应的值
zincrby key increment member //给指定的key终得member修改对应的increment量
3)获取当前系统时间
time
3、sorted_set 类型数据操作的注意事项
- score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
- sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
3、通用指令
3.1、key通用指令
key是一个字符串,通过key获取redis中保存的数据
1、key 基本操作
1)删除指定key
del key
2)获取key是否存在
exists key
3)获取key的类型
type key
2、key 扩展操作(时效性控制)
1)为指定key设置有效期
expire key seconds //设置key的有效时间秒数
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
2)获取key的有效时间
ttl key //打印剩余的有效时间秒数(会有三种返回值。-2:打印的key是一个过期的;-1:未设置有效时间;具体数字:剩余的有效时间)
pttl key //打印剩余的有效时间毫秒数
3)切换key从时效性转换为永久性
persist key //只能对具有时效性的key进行设置
3、key 扩展操作(查询模式)
1)查询key
key pattern
查询模式规则
* 匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号
keys * 查询所有
keys it* 查询所有以it开头
keys *heima 查询所有以heima结尾
keys ??heima 查询所有前面两个字符任意,后面以heima结尾
keys user:? 查询所有以user:开头,最后一个字符任意
keys u[st]er:1 查询所有以u开头,以er:1结尾,中间包含一个字母,s或t
4、key 其他操作
1)为key改名
rename key newkey //如果newkey是一个已经存在的key,那么新的key就会覆盖之前的key
renamenx key newkey //如果newkey是一个已经存在的key,那么就会报错
2)对多有key排序
sort //排序方式多种多样,可以根据指令的提示进行设置,默认是数字的从小到大排列
3)其他key通用操作
help @generic
3.2、数据库通用指令
1、db基本操作
1)切换数据库
select index //redis数据库划分为0-15个,我们默认的位置是在0
2)其他 操作
quit //退出
ping //测试是否和服务器连通
echo message //打印输出自己输入的信息
2、db相关操作
1)数据移动
move key db //将key移动到对应的db中,只有对应的db中没有时才能移动成功
2)数据清除
dbsize //获取当前db中的key总量
flushdb //删除当前db中的数据
flushall //删除所有数据库中的数据
3、演示案例
Redis默认含有16个数据库,我们可以使用命令行进行切换。
我们默认使用的是0号数据库。除了dbsize,你也可以使用keys * 查看你当前数据库下的所有key
- 0号数据库添加值
- 3号数据库获取值
- 0号数据库清楚当前数据库值
- 0号数据库添加值
- 4号数据库清楚所有数据库值
- 0号数据库获取值
以下截图来源redis配置文件
本文标签: Redis
版权声明:本文标题:Redis(一) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1729477476a1202231.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论