Java Web-Redis学习
基本概念
Redis是一款高性能的NOSQL系列的、非关系型数据库
NOSQL:not only SQL,是一系列非关系型数据库的总称,例如radis、hbase等数据库。
非关系型数据库
没有表的概念,数据之间没有关联关系
数据存储在内存中
来源: https://blog.csdn.net/Pengxiaozhen1111/article/details/88220160
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
Redis可以用来做缓存(在数据库和服务器之间建立缓存层以提高资源查询速度),也可以做存储;支持ADF和RDB两种持久化方式。
为什么要使用非关系型数据库?
来源: https://cloud.tencent.com/developer/ask/145973
非关系型数据库必然会成为未来数据存储的选择趋势,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库NoSQL则由于其本身的特点得到了非常迅速的发展。
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题:NoSQL一直伴随着大数据技术的发展,各种NoSQL层出不穷。
导致了NoSQL的兴起的原因包括:
1)数据的高并发读写
2)数据的高可用性
3)海量数据存储
4)海量数据的实时分析等等
5)简单易部署
非关系型数据库的缺点:
- 技术较新,维护的工具和资料有限
- 不提供对sql的支持
- 不提供关系型数据库对事物的处理
非关系型数据库的优点:
- 不需要经过SQL层的解析,性能好
- 基于键值对,数据之间没有耦合,容易进行拓展
一般将数据存储在关系型数据库中,在NOSQL数据库中备份存储关系型数据库作为缓存
主流的NOSQL产品
• 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
• 列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
• 文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
• 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
Radis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset
1.3.1 redis的应用场景
• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒):redis的key支持自动过期被删除的处理
• 分布式集群架构中的session分离
安装
在windows平台下:
- redis.windows.conf:配置文件
- redis-cli.exe:客户端
- redis-server.exe:服务器端
Linux下:
生产环境安装
make
make test
make install
% cd utils
% ./install_server.sh
关于后面两个命令,README里面有写:
Make install will just install binaries in your system, but will not configure
init scripts and configuration files in the appropriate place. This is not
needed if you want just to play a bit with Redis, but if you are installing
it the proper way for a production system, we have a script doing this
for Ubuntu and Debian systems
运行服务器端:
% cd src
% ./redis-server
运行客户端:
% cd src
% ./redis-cli
配置文件
/redis-5.0.4/redis.conf
注意,如果想要让redis在启动时读取配置文件中的配置,启动时就想要从命令行启动(Linux下当然不需要担心这种问题),并且要带上参数,例如
./redis-server /path/to/redis.conf
jedis常用的配置内容:
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
#redis服务器的IP
redis.ip=xxxxxx
#redis服务器的Port
redis1.port=6379
使用Redis
命令
Redis的数据结构
redis存储的是key:value格式的数据。其中key都是字符串,value有五种不同的数据结构
1) 字符串类型 string
2) 哈希类型 hash,可以理解为map格式
3) 列表类型 list
4) 集合类型 set,不允许重复元素
5) 有序集合类型 sortedset
字符串类型 string
存储:set key value
存储的value可以是多个
获取:get key
删除:del key
哈希类型 hash
存储:hset key field value
获取:hget key field
hgetall key:获取所有键值对
删除:hdel key field
列表类型 list
- 存储:
- lpush key value(从左侧添加)
- rpush key value(从右侧添加)
- 获取:
- lrange key start end:范围获取,从左往右数,从0开始
- lrange key 0 -1:范围为所有,也就是获取所有元素
- 删除:
- lpop key:从左侧弹出一个元素
- rpop key:从右侧弹出一个元素
- 存储:
集合类型 set
set不允许重复,元素的存储是无序的,输入进去的顺序和获取的顺序是不一样的
- 存储:sadd key value
- 获取:smembers key:获取所有元素
- 删除:srem key value:删除set集合中的某个元素
有序集合 sortedset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
存储:zadd key score value:存储数据以及数据对应的分数
存储是可以覆盖的:同key同value,不同score
获取:zrange key start end [withscores]:输入withscores之后可以获取到score
删除:zrem key value
sortedset可以很方便地用来做排行榜之类的应用
通用命令:
- keys *:查询所有的键
- type key:查询某个键的类型
- del key:删除指定的key和对应的所有value
持久化
当redis服务器重启或者电脑重启时,数据会丢失
可以将数据持久化保存到文件中
redis持久化方案:
RDB(Redis DataBase):默认方式,不需要进行配置
在一定的间隔时间中,检测key的变化情况,然后去持久化数据
对性能影响比较低。
持久化之后会保存一个rdb文件,在下一次启动时会自动读取rdb文件中的内容并加载进内存
使用步骤:
编辑redis.conf文件
save 900 1
save 300 10
save 60 10000
解释:这些是redis判断是否需要进行持久化的检查的时间间隔和触发条件
after 900 sec (15 min) if at least 1 key changed
after 300 sec (5 min) if at least 10 keys changed
after 60 sec if at least 10000 keys changed
重新启动redis服务器并指定配置文件的名称
优缺点:
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。
来源:https://www.cnblogs.com/itdragon/p/7906481.html
AOF(Append Only File):
对性能影响比较大,日志记录的方式,可以记录每一条命令的操作。可以在每一次命令操作后持久化数据
它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
使用步骤:
- 编辑redis.conf文件,编辑appendonly属性由no改为yes就可以开启AOF了,它有三个可以选择的选项:
appendfsync always :每一次操作都进行持久化
appendfsync everysec:每间隔一秒都进行持久化
appendfsync no:不持久化
要启用哪个,就把它前面的井号删掉,然后把其他的加上井号
- 重新启动,带上配置文件路径
- redis会生成appendonly.aof文件
优缺点:
优点:数据的完整性和一致性更高
缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
redis不能保证所有数据不丢失,只能保证大多数数据不丢失
Jedis
Jedis是一款java操作redis数据库的工具
使用步骤:
- 下载Jedis的jar包
- 使用
快速入门
import org.junit.Test;import redis.clients.jedis.Jedis;
/*
Jedis的测试类
*/
public class JedisTest {
/*
.快速入门
*/
@Test
public void test1(){
//1.获取连接
//默认端口是6379
Jedis jedis=new Jedis("localhost",6379);//如果使用空参的构造函数,默认就是localhost和6379端口
//2.操作
jedis.set("username","zhangsan");
//3.关闭连接
jedis.close();
}
}
可以看出,Jedis相比JDBC,使用起来要简单太多
Jedis操作数据结构
Jedis中的方法名和redis中的数据结构操作方法名称是一模一样的
string
set
get
setex():存储指定了过期时间的key和value,到期自动过期
hash
hset
hget
hegtAll
list
lpush\rpush
lpop\rpop
lrange
set
sadd
smembers
sortedset
zadd
zrange
连接池
JedisPool:自带的连接池,不需要额外的第三方实现
- 从连接池中获取Jedis连接
- 调用方法getResource()获取连接
JedisPool jedisPool=new JedisPool(); Jedis jedis = jedisPool.getResource();
/*
使用该Jedit对象
*/
//归还给连接池中
jedis.close();
连接池对象创建的使用可以传递连接池配置对象:
JedisPoolConfig config=new JedisPoolConfig(); config.setMaxTotal(50);//最大50个连接
config.setMaxIdle(10);//最大空闲连接
JedisPool jedisPool=new JedisPool(config,"localhost",6379);
案例
在使用JDBC查询数据库之前先查询redis,redis如果没有数据,就去查询数据库,然后将该数据加入redis.
对于中文字符,在redis中是使用转码存储的,在命令行中直接get可能会发现不是中文字符,但是在程序中获取的话是没问题的
使用redis一般用来缓存不经常发送变化的数据,因为数据库中的内容执行了增删改的操作之后需要在方法中主动地更新redis中的值以保存和关系型数据库的同步。当然一般为了方便可能不会采用修改值的方式,而是之间把原键值对删除,下一次再从数据库中获取
以上是 Java Web-Redis学习 的全部内容, 来源链接: utcz.com/z/393904.html