redis学习笔记.docx
- 文档编号:7845737
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:80
- 大小:1.84MB
redis学习笔记.docx
《redis学习笔记.docx》由会员分享,可在线阅读,更多相关《redis学习笔记.docx(80页珍藏版)》请在冰豆网上搜索。
redis学习笔记
1课程目标
掌握redis常用数据结构(string/hash/list/sortedset)的存取数据方法
掌握redis集群使用方法
掌握redis在javaEE电商项目中的使用方法
2redis介绍
2.1什么是NoSQL
NoSQL,泛指非关系型的数据库,NoSQL即Not-OnlySQL,它可以作为关系型数据库的良好补充。
随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。
而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
1、Highperformance-对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。
关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。
其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
2、HugeStorage-对海量数据的高效率存储和访问的需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
3、HighScalability&&HighAvailability-对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像webserver和appserver那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。
对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
一些主流的NOSQL产品:
NoSQL数据库的四大分类如下:
⏹键值(Key-Value)存储数据库
相关产品:
TokyoCabinet/Tyrant、Redis、Voldemort、BerkeleyDB
典型应用:
内容缓存,主要用于处理大量数据的高访问负载。
数据模型:
一系列键值对
优势:
快速查询
劣势:
存储的数据缺少结构化
⏹列存储数据库
相关产品:
Cassandra,HBase,Riak
典型应用:
分布式的文件系统
数据模型:
以列簇式存储,将同一列数据存在一起
优势:
查找速度快,可扩展性强,更容易进行分布式扩展
劣势:
功能相对局限
⏹文档型数据库
相关产品:
CouchDB、MongoDB
典型应用:
Web应用(与Key-Value类似,Value是结构化的)
数据模型:
一系列键值对
优势:
数据结构要求不严格
劣势:
查询性能不高,而且缺乏统一的查询语法
⏹图形(Graph)数据库
相关数据库:
Neo4J、InfoGrid、InfiniteGraph
典型应用:
社交网络
数据模型:
图结构
优势:
利用图结构相关算法。
劣势:
需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
2.2redis历史发展
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人SalvatoreSanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。
不过SalvatoreSanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年SalvatoreSanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者PieterNoordhuis一起继续着Redis的开发,直到今天。
SalvatoreSanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。
HackerNews在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。
国内如新浪微博、街旁网、知乎网,国外如GitHub、StackOverflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发,SalvatoreSanfilippo和PieterNoordhuis也分别在3月和5月加入VMware,全职开发Redis。
2.3什么是redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。
它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如
下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型。
2.4redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。
(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。
(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
3测试环境
redis需要安装在linux服务器上运行测试,本教程使用linux虚拟机及ssh客户端进行功能测试。
3.1虚拟机
创建Centos6.4虚拟机作为linux服务器。
虚拟机ip:
192.168.101.3
3.2ssh客户端
在开发环境(windows)安装ssh客户端,本教程使用SecureCRT作为ssh客户端连接虚拟机。
4安装运行redis
4.1redis安装环境
redis是C语言开发,建议在linux上运行,本教程使用Centos6.4作为安装环境。
安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:
yuminstallgcc-c++
4.2redis安装
⏹版本说明
本教程使用redis3.0版本。
3.0版本主要增加了redis集群功能。
⏹源码下载
从官网下载
http:
//download.redis.io/releases/redis-3.0.0.tar.gz
将redis-3.0.0.tar.gz拷贝到/usr/local下
⏹解压源码
tar-zxvfredis-3.0.0.tar.gz
⏹进入解压后的目录进行编译
cd/usr/local/redis-3.0.0
make
⏹安装到指定目录,如/usr/local/redis
cd/usr/local/redis-3.0.0
makePREFIX=/usr/local/redisinstall
⏹redis.conf
redis.conf是redis的配置文件,redis.conf在redis源码目录。
注意修改port作为redis进程的端口,port默认6379。
⏹拷贝配置文件到安装目录下
进入源码目录,里面有一份配置文件redis.conf,然后将其拷贝到安装路径下
cd/usr/local/redis
mkdirconf
cp/usr/local/redis-3.0.0/redis.conf/usr/local/redis/bin
⏹安装目录bin下的文件列表
redis3.0新增的redis-sentinel是redis集群管理工具可实现高可用。
配置文件目录:
4.3redis启动
4.3.1前端模式启动
直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。
如下图:
4.3.2后端模式启动
修改redis.conf配置文件,daemonizeyes以后端模式启动。
执行如下命令启动redis:
cd/usr/local/redis
./bin/redis-server./redis.conf
redis默认使用6379端口。
也可更改redis.conf文件,修改端口号:
4.3.3启动多个redis进程
方法1:
启动时指定端口可在一台服务器启动多个redis进程。
cd/usr/local/redis/bin
./redis-server./redis.conf--port6380
方法2(推荐此方法):
创建多个redis目录,以端口号命名,比如:
创建6379、6380两个目录,将redis的安装文件bin和conf拷贝至这两个目录。
修改6379目录下的redis.conf设置端口号为6379
修改6380目录下的redis.conf设置端口号为6380
启动6379和6380目录下的redis-server程序:
cd6379
./redis-server./redis.conf
cd6380
./redis-server./redis.conf
查询当前redis的进程:
4.4redis停止
强行终止Redis进程可能会导致redis持久化数据丢失。
正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:
cd/usr/local/redis
./bin/redis-clishutdown
4.5redis客户端
在redis的安装目录中有redis的客户端,即redis-cli(RedisCommandLineInterface),它是Redis自带的基于命令行的Redis客户端。
4.5.1连接redis服务端
执行bin/redis-cli连接redis服务端:
从上图得知redis-cli默认连接本机的redis,本机的redis没有启动则报上图中的错误。
指定连接redis服务的ip和端口:
4.5.2向redis服务端发送命令
redis-cli连上redis服务后,可以在命令行发送命令。
⏹ping
Redis提供了PING命令来测试客户端与Redis的连接是否正常,如果连接正常会收到回复PONG
⏹set/get
使用set和get可以向redis设置数据、获取数据。
⏹del
删除指定key的内容。
例如:
delname
⏹Keys*
查看当前库中所有的key值
4.6redis多数据库
4.6.1redis实例
一个redis进程就是一个redis实例,一台服务器可以同时有多个redis实例,不同的redis实例提供不同的服务端口对外提供服务,每个redis实例之间互相影响。
每个redis实例都包括自己的数据库,数据库中可以存储自己的数据。
4.6.2多数据库测试
一个Redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。
一个redis实例最多可提供16个数据库,下标从0到15,客户端默认连接第0号数据库,也可以通过select选择连接哪个数据库,如下连接1号库:
在1号库中查询上节设置的数据,结果查询不到:
重新选择第0号数据库,查询数据:
如果选择一个不存在数据库则会报错:
注意:
redis不支持修改数据库的名称,只能通过select0、select1...选择数据库。
4.6.3注意问题
在0号数据库存储数据,在1号数据库执行清空数据命令却把0号数据库的数据给清空了:
建议:
不同的应用系统要使用不同的redis实例而不是使用同一个redis实例下的不同数据库。
5jedis
5.1jedis介绍
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。
Jedis同样也是托管在github上,地址:
5.2通过jedis连接redis单机
5.2.1jar包
pom坐标:
jar包如下:
5.2.2单实例连接
通过创建单实例jedis对象连接redis服务,如下代码:
//单实例连接redis
@Test
publicvoidtestJedisSingle(){
Jedisjedis=newJedis("192.168.101.3",6379);
jedis.set("name","bar");
Stringname=jedis.get("name");
System.out.println(name);
jedis.close();
}
5.2.2.1连接超时解决
由于linux防火墙默认开启,redis的服务端口6379并不在开放规则之内,所有需要将此端口开放访问或者关闭防火墙。
关闭防火墙命令:
seviceiptablesstop
如果是修改防火墙规则,可以修改:
/etc/sysconfig/iptables文件
5.2.3使用连接池连接
通过单实例连接redis不能对redis连接进行共享,可以使用连接池对redis连接进行共享,提高资源利用率,使用jedisPool连接redis服务,如下代码:
@Test
publicvoidpool(){
JedisPoolConfigconfig=newJedisPoolConfig();
//最大连接数
config.setMaxTotal(30);
//最大连接空闲数
config.setMaxIdle
(2);
JedisPoolpool=newJedisPool(config,"192.168.101.3",6379);
Jedisjedis=null;
try{
jedis=pool.getResource();
jedis.set("name","lisi");
Stringname=jedis.get("name");
System.out.println(name);
}catch(Exceptionex){
ex.printStackTrace();
}finally{
if(jedis!
=null){
//关闭连接
jedis.close();
}
}
}
详细的连接池配置参数参考下节jedis和spring整合中applicationContext.xml的配置内容。
5.2.4jedis与spring整合
配置spring配置文件applicationContext.xml
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns: mvc="http: //www.springframework.org/schema/mvc" xmlns: context="http: //www.springframework.org/schema/context" xmlns: aop="http: //www.springframework.org/schema/aop"xmlns: tx="http: //www.springframework.org/schema/tx" xsi: schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/spring-beans-3.2.xsd http: //www.springframework.org/schema/mvc http: //www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http: //www.springframework.org/schema/context http: //www.springframework.org/schema/context/spring-context-3.2.xsd http: //www.springframework.org/schema/aop http: //www.springframework.org/schema/aop/spring-aop-3.2.xsd http: //www.springframework.org/schema/tx http: //www.springframework.org/schema/tx/spring-tx-3.2.xsd"> --连接池配置--> --最大连接数--> --最大空闲连接数--> --每次释放连接的最大数目--> --释放连接的扫描间隔(毫秒)--> --连接最小空闲时间--> --连接空闲多久后释放,当空闲时间>该值且空闲连接>最大空闲连接数时直接释放--> --获取连接时的最大等待毫秒数,小于零: 阻塞不确定的时间,默认-1--> --在获取连接的时候检查有效性,默认false--> --在空闲时检查有效性,默认false--> --连接耗尽时是否阻塞,false报异常,ture阻塞直到超时,默认true--> --redis单机通过连接池--> 测试代码: privateApplicationContextapplicationContext; @Before publicvoidinit(){ applicationContext=newClassPathXmlApplicationContext( "classpath: applicationContext.xml"); } @Test publicvoidtestJedisPool(){ JedisPoolpool=(JedisPool)applicationContext.getBean("jedisPool"); try{ jedis=pool.getResource(); jedis.set("name","lisi"); Stringname=jedis.get("name"); System.out.println(name); }catch(Exceptionex){ ex.printStackTrace(); }finally{ if(jedis! =null){ //关闭连接 jedis.close(); } } } 6数据类型--string 6.1redisstring介绍 redis中没有使用C语言的字符串表示,而是自定义一个数据结构叫SDS(simpledynamicstring)即简单动态字符串。 打开下载的redis源码包,找到src下的sds.h文件查看sds源码: structsdshdr{ //字符串长度 unsignedintlen; //buf数组中未使用的字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- redis 学习 笔记