Redis简介
- 概念: redis是一款高性能的NOSQL系列的非关系型数据库
1.1.什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
1.1.1. NOSQL和关系型数据库比较
优点:
1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
3)不提供关系型数据库对事务的处理。
1.1.2. 非关系型数据库的优势:
1)性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
2)可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
1.1.3. 关系型数据库的优势:
1)复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
2)事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
1.1.4. 总结
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
1.2.主流的NOSQL产品
• 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
• 列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
• 文档型数据库
相关产品:CouchDB、MongoDB,Memcache
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
• 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
1.3 什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
- 字符串类型 string
- 哈希类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合类型 sortedset
1.3.1 redis的应用场景
• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒
• 分布式集群架构中的session分离
2. 下载安装
- 官网:https://redis.io
- 中文网:http://www.redis.net.cn/
- 解压直接可以使用:
* redis.windows.conf:配置文件
* redis-cli.exe:redis的客户端
* redis-server.exe:redis服务器端
redis通用命令
命令:clear
功能:清楚屏幕中的信息
命令:quit 或 exit
功能:退出客户端
命令:(1) help 命令名称 (2) help @组名
功能:(1)获取命令帮助文档。 (2)获取组中所有命令信息名称
命令:type key
功能:获取键对应的value的类型
命令:exists key
功能:获取key是否存在
命令:del key
功能:删除key
命令:expire key seconds (seconds 秒)
命令:pexpire key milliseconds (milliseconds 毫秒)
命令:expireat key timestamp
命令:pexpireat key milliseconds-timestamp
功能:为指定key设置有效期
命令:ttl key
命令:pttl key
功能:获取key的有效时间
命令:persist key
功能:切换key从时效性转换为永久性
命令:keys pattern
功能:查询key
命令:rename key newkey
命令:renamenx key newkey
功能:为key改名
命令:sort
功能:对所有key排序
字符串类型 string
命令:get key
功能:根据key查询对应的value,如果不存在,返回空(nil)
命令:set key value
功能:设置key和value值
命令:del key
功能:根据key删除
命令:mset key1 value1 key2 value2 …
功能:添加/修改多个数据
命令:mget key1 key2 …
功能:获取多个数据
命令:strlen key
功能:获取数据字符个数
命令:append key value
功能:追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
注意:多指令执行的时间比单指令执行的时间短效率高。
String类型数据的扩展操作
设置数值数据增加指定范围的值(给指定的key的value值加一)
incr key
incrby key increment (increment 表示指定增加的数值只能为整数可以为负数)
incrbyfloat key increment (increment 增加的数值为浮点数可以为负数)
设置数值数据减少指定范围的值
decr key
decrby key increment
string 作为数值操作
1)string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
2)redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发
带来的数据影响。
3) 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。
9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)
应用:(redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性)此方案适用于所有数据库,且支持数据库集群
设置数据具有指定的生命周期
功能:数值该key多少时间过期
setex key seconds value (seconds 表示秒)
psetex key milliseconds value (milliseconds 表示毫秒)
哈希类型 hash
hash存储结构优化:
1)如果field数量较少,存储结构优化为类数组结构
2)如果field数量较多,存储结构使用HashMap结构
功能:添加/修改数据
命令:hset key field value
功能:获取数据
命令:hget key field
功能:获取所有的field和value
命令:hgetall key
功能:删除数据
命令:hdel key field1 [field2]
功能:添加/修改多个数据
命令:hmset key field1 value1 field2 value2 …
功能:获取多个数据
命令:hmget key field1 field2 …
功能:获取哈希表中字段的数量
命令:hlen key
功能:获取哈希表中是否存在指定的字段
命令:hexists key field
hash 类型数据扩展操作
功能:获取哈希表中所有的字段名
命令:hkeys key
功能:获取哈希表中所有的字段值
命令:hvals key
功能:设置指定字段的数值数据增加指定范围的值
命令:hincrby key field increment (increment 表示指定增加的数值)
命令:hincrbyfloat key field increment
功能:如果存在就不新增,不存在就新增
命令:hsetnx key field value
hash 类型数据操作的注意事项
1)hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,
对应的值为(nil)
2)每个 hash 可以存储 2^32-1 个键值对
3)hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存
储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
4)hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问
瓶颈
hash 类型应用场景
1)以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
2)将商品编号作为field,购买数量作为value进行存储
3)添加商品:追加全新的field与value
4)浏览:遍历hash
5)更改数量:自增/自减,设置value值 删除商品:删除field
6)清空:删除key
列表类型 list
可以添加一个元素到列表的头部(左边)或者尾部(右边)
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
list类型:保存多个数据,底层使用双向链表存储结构实现
功能:添加/修改数据
命令:lpush key value1 [value2] … (从左边添加)
命令:rpush key value1 [value2] … (从右边添加)
功能:获取数据
命令:lrange key start stop (start 开始索引 stop 结束索引 )
功能:根据索引获取数据(从0开始)
命令:lindex key index
功能:获取list的长度
命令:llen key
功能:获取并移除数据
命令:lpop key (删除列表最左边的元素,并将元素返回)
命令:rpop key (删除列表最右边的元素,并将元素返回)
list 类型数据扩展操作
功能:规定时间内获取并移除数据
命令:blpop key1 [key2] timeout
命令:brpop key1 [key2] timeout
功能:规定时间内可以实现一个请求就将一个队列中的元素移动到另一个列表中
命令:brpoplpush source dastination timeout
功能:移除指定数据
命令:lrem key count value (count 指定元素的个数)
集合类型 set
1)新的存储需求:存储大量的数据,在查询方面提供更高的效率
2)需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
3)set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
功能:添加数据
命令:sadd key member1 [member2]
功能:获取全部数据
命令:smembers key
功能:删除数据
命令:srem key member1 [member2]
set 类型数据的基本操作
功能:获取集合数据总量
命令:scard key
功能:判断集合中是否包含指定数据
命令:sismember key member
set 类型数据的扩展操作
功能:随机获取集合中指定数量的数据
命令:srandmember key [count] (count 指定获取数据数量值)
功能:随机获取集合中的某个数据并将该数据移出集合
命令:spop key [count]
功能:求两个集合的交、并、差集
命令:sinter key1 [key2] (交集)
命令:sunion key1 [key2] (并集)
命令:sdiff key1 [key2] (差集)
功能:求两个集合的交、并、差集并存储到指定集合中
命令:sinterstore destination key1 [key2] (destination 指定的集合)
命令:sunionstore destination key1 [key2]
命令:sdiffstore destination key1 [key2]
功能:将指定数据从原始集合中移动到目标集合中
命令:smove source destination member
有序集合类型 sortedset
1)新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
2)需要的存储结构:新的存储模型,可以保存可排序的数据
3)sorted_set类型:在set的存储结构基础上添加可排序字段
功能:添加数据
命令:zadd key score1 member1 [score2 member2] (score1 顺序值)
功能:获取全部数据
命令:zrange key start stop [WITHSCORES] (WITHSCORES 显示排序值)
命令:zrevrange key start stop [WITHSCORES]
功能:删除数据
命令:zrem key member [member …]
sorted_set 类型数据的基本操作
功能:按条件获取数据
命令:zrangebyscore key min max [WITHSCORES] [LIMIT]
命令:zrevrangebyscore key max min [WITHSCORES]
功能:条件删除数据
命令:zremrangebyrank key start stop
命令:zremrangebyscore key min max
功能:获取集合数据总量
命令:zcard key
命令:zcount key min max
功能:集合交、并操作
命令:zinterstore destination numkeys key [key …]
命令:zremrangebyscore key min max
注意:1)min与max用于限定搜索查询的条件 2)start与stop用于限定查询范围,作用于索引,表示开始和结束索引
3)offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
功能:获取数据对应的索引(排名)
命令:zrank key member
命令:zrevrank key member
功能:score值获取与修改
命令:zscore key member
命令:zincrby key increment member
Jedis简介
一款java操作redis数据库的工具.
Maven导入
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-mp-spring-boot-starter</artifactId>
<version>4.3.2.B</version>
</dependency>