亿级并发笔记相关文件预习_第1页
亿级并发笔记相关文件预习_第2页
亿级并发笔记相关文件预习_第3页
亿级并发笔记相关文件预习_第4页
亿级并发笔记相关文件预习_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、江-5271-61772培优1 Redis 缓存介绍1.1缓存策略1.1.1 缓存机制缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的,应用程序在运行缓存读写数据,在特定的时刻或会同步缓存和物理数据源的数据。缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑和缓存数据的生命周期。的介质,还要考虑到管理缓存的并发1.1.2 缓存中存在的问题1. 缓存中的数据是真实数据库数据的备份,如何保证数据一致性.2. 数据都在内存中,如果断电/宕

2、机/内存数据如何恢复.3. 如果缓存中的数据如果达到临界值(512M),缓存大小如何维护.4. 缓存中保存数据应该采用什么样的数据结构.1.2缓存三大问题1.2.1 缓存穿透条件:一个不存在的数据说明:当一个不存在的数据时,因为缓存中没有这个 key,导致缓存.最终数据库.但是数据库中没有该数据所以返回 null.隐患:如果有人频繁一个不存在的数据,可能会导致数据库负载高导致宕机.总务系统一个不存在的数据,称之为缓存穿透.1江-5271-61772培优1.2.2 缓存击穿条件:当缓存 key 失效/过期/未命中时,高并发该 key说明:如果给一个 key 设定了失效时间,当key 失效时有一万

3、的并发请求这个 key,这时缓存失效,所有的请求都会数据库.称之为缓存击穿.场景:热点消息库负载过高.量很大,如果该缓存失效则会直接数据库,导致数据1.2.3 缓存雪崩前提:高并发,缓存命中较低或者失效时说明:假设缓存都设定了失效时间,在同一时间内缓存大量失效.如果这时用户高并发.缓存过低.导致全部的用户都会真实的数据库.场景:在高并发条件下.缓存动态更新时1.3Redis 安装1.3.1 Redis 介绍redis 是一个 key-value系统。和 Memcached 类似,它支持的 value 类型相对,包括 string(字符串)、list(链表)、set(集合)、zset(sorte

4、d set -有序集合)和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。它可以用作数据库、缓存和消息中间件.在此基础上,redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的且在此基础上实现了 master-slave(主从)同步。文件,并Redis 是一个高性能的 key-value 数据库。redis 的出现,很大程度补偿了 memcached这类 key/value的不

5、足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C+,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang 等客户端,使用很方便。1Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得 Redis 可执行单层树。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步,可订阅一个频道并接收主服务器完整的消息发布余很有帮助。同步对操作的可扩展性和数据冗2江-5271-61772培优Redis 的运行速度:读速度 11000

6、0/s,写速度 81000 次每秒.平均 10 万/s1.3.2Redis:如图-1 所示图- 1方式 2:选择正确的版本号即可.课上演示为 3.2.8 版本Redis 安装1.3.3上传 redis 安装包,到指定目录下/usr/local/src 下如图-2 所示图- 2解压 redis 命令: tar -xvf redis.3.2.8.tar.gz3wget江-5271-61772培优1.3.4 校验编译 Redis2.Make install 安装LINK redis-server INSTALL redis-sentinel LINK redis-cliINSTALL redis-c

7、heck-rdb LINK redis-check-aof如图-3 所示#redis 服务启动项#redis 哨兵的机制(实现 redis 高可用) #连接 redis 客户端程序#校验 redis 持久化方式图- 31.3.5 修改配置文件说明:作为第一个注释 IP 绑定如图-4 所示图- 4关闭保护模式如图-5 所示41. Make 编译江-5271-61772培优图-5开启启动如图-6 所示图-61.3.6 Redis 启动命令安装前提:需要安装 GCC1.3.7 启动效果图如图-7 所示5yum -y install gcc automake autoconf libtool make

8、 1.redis-server缺点:不能执行后续操作2. redis-server & 表示有后续操作.总结:以上令 启动时 redis 的设置都是默认的 IP 绑定/保护模式默认值处理3. redis-server redis.conf 按照配置文件方式启动4. kill -9 pid5. redis-cli shutdown 或者 redis-cli -p 6379 shutdown江-5271-61772培优图- 71.4Redis 命令1.4.1 String 类型6命令说明案例set添加 key-valueset username adminget根据 key 获取数据get

9、 usernamestrlen获取 key 的长度strlen keyexistskey 是否存在exists name返回 1 存在0 不存在del删除 redis 中的 keydel keyKeys用于符合条件的 keykeys *redis 中全部的 keykeys n?me 使用占位符获取数据keys nam* 获取 nam 开头的数据mset赋值多个 key-valuemset key1 value1 key2 value2 key3 value3mget获取多个 key 的值mget key1 key2append对某个 key 的值进行追加append key valuetype

10、检查某个 key 的类型type keyselect切换 redis 数据库select 0-15 redis 中共有16 个数据库flushdb清空单个数据库flushdb江-5271-61772培优1.4.2 Hash 类型说明:可以用散列类型保存对象和属性值例子:User 对象id:2,name:小明,age:191.4.3 List 类型说明:Redis 中的 List 集合是双端循环列表,分别可以从左右两个方向数据.7命令说明案例hset为对象添加数据hset key field valuehget获取对象的属性值hget key fieldhexists对象的属性是否存在HEXIS

11、TS key field1 表示存在0 表示不存在hdel删除 hash 中的属性hdel user field field .hgl获取 hash 全部元素和值HGL keyhkyes获取 hash 中的所有字段HKEYS keyhlen获取 hash 中所有属性的数量hlen keyhmget获取 hash 里面指定字段的值hmget key field field .hmset为 hash 的多个字段设定值hmset key field value field value .hsetnx设置 hash 的一个字段,只有当这个字段不存在时有效HSETNX key field valuehs

12、trlen获取 hash 中指定 key 的长度HSTRLEN key fieldhvals获取 hash 的所有值HVALS userflushall清空全部数据库flushallincr自动加 1incr keydecr自动减 1decr keyincrby指定数值添加incrby 10decrby指定数值减decrby 10expire指定 key 的生效时间秒expire key 20 key20 秒后失效pexpire指定 key 的失效时间毫秒pexpire key 2000key 2000 毫秒后失效ttl检查 key 的剩余存活时间ttl keypersist撤销 key 的失

13、效时间persist key江-5271-61772培优List 集合可以当做队列使用,也可以当做栈使用队列:存入数据的方向和获取数据的方向相反栈:存入数据的方向和获取数据的方向相同1.4.4 Redis 事务命令说明:redis 中操作可以添加事务的支持.一项任务可以由多个redis 命令完成,如果有一个命令失败导致入库失败时.需要实现事务.8命令说明案例multi标记一个事务开始:6379> MULTI OK命令说明案例lpush从队列的左边入队一个或多个元素LPUSH key value value .rpush从队列的右边入队一个或多个元素RPUSHkeyval

14、ue value .lpop从队列的左端出队一个元素LPOP keyrpop从队列的右端出队一个元素RPOP keylpushx当队列存在队列的左侧入队一个元素LPUSHX key valuerpushx当队列存在队列的右侧入队一个元素RPUSHx key valuelrange从列表中获取指定返回的元素LRANGE key start stop Lrange key 0 -1 获取全列的数据lrem从存于 key 的列表里移除前count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:count > 0: 从头往尾移除值为 value 的元素。

15、count < 0: 从尾往头移除值为 value 的元素。count = 0: 移除所有值为value 的元素。LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。需要注意的是,如果 list 里没有存在 key 就会被当作空 list 处理,所以当key 不存在的时候,这个命令会返回 0。Lset设置 index 位置的 list 元素的值为valueLSET key index value江-5271-61772培优2 Redis 高级应用2.1Redis 入门案例2.1.1 添加 jar 包文件说明:在 JT-PARENT 项

16、目中添加 jar 包文件2.1.2 入门案例-String9/* 连接redis* 参数介绍:* redisIP 地址.* redis:6379*/ Testpublic void test01()Jedis jedis = new Jedis("66",6379); jedis.set("redis", "redis 入门案例"); System.out.println<!- jedis -><dependency><groupId>redis.clients</g

17、roupId><artifactId>jedis</artifactId><version>$jedis.version</version></dependency><!-添加 spring-datajar 包-><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.4.1.RELEAS

18、E</version></dependency>exec执行所有 multi 之后发令:6379> EXECOKdiscard丢弃所有 multi 之后发令江-5271-61772培优2.1.3 入门案例-hash结果展现:2.1.4 入门案例-List结果展现:2.2Spring 整合 Redis2.2.1 编辑 properties 配置文件 redis.host=6610获取数据 5获取参数:e, d, c, b, aTestpublic void test02()Jedis jedis = new Jedis(&

19、quot;48", 6379);Long number = jedis.lpush("list", "a","b","c","d","e"); System.out.println("获取数据"+number);List<String> list= jedis.lrange("list", 0, -1); System.out.println("获取参数:"+list)

20、;操作完成!1name=tomcat, age=18, id=1Testpublic void test01()Jedis jedis = new Jedis("48", 6379); jedis.hset("user", "id", "1");jedis.hset("user", "name", "tomcat");jedis.hset("user", "age", "18&qu

21、ot;);System.out.println("操作完成!"+jedis.hget("user", "id"); Map<String,String> map = jedis.hgl("user"); System.out.println(map);("获取 redis 中的数据:"+jedis.get("redis");/为数据设定超时时间秒jedis.setex("1804", 100, "1804 班");江-527

22、1-61772培优2.2.2 Spring 添加配置文件2.2.3 Spring 整合 Redis(初级)2.2.4 Spring 整合 Redis(高级)<?xml version="1.0"<beans xmlns="encoding="UTF-8"?>"xmlns:xsi=""xmlns:context=""xmlns:mvc="xsi:schemaLocation="""><!-每次都创建 jedis 对象性能较低&l

23、t;bean id="poolConfig"创建 jedis 线程池->class="redis.clients.jedis.JedisPoolConfig"><!-定义连接总数-><property name="maxTotal" value="$redis.maxTotal"/>11<!-通过 bean管理 Jedis 对象-><bean id="jedis" class="redis.clients.jedis.Jedis&q

24、uot;><constructor-arg name="host" value="$redis.host"/><constructor-arg name="port" value="$redis.port"/></bean><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConf igurer"><!-Resource locations;

25、 -><property name="locations"><list><value>classpath:/properties/perties</value><value>classpath:/properties/perties</value></list></property></bean>redis.port=6379 redis.maxTotal=1000 redis.maxIdle=100 redis.testOnB

26、orrow=true江-5271-61772培优2.2.5 Spring 整合 Redis-工具类(高级适用)编辑工具类代码 RedisService12package mon.service;import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.sp

27、ringframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;Servicepublic class RedisService Autowiredprivate StringRedisTemplate redisTemplate;<!-定义最大闲

28、置-><property name="maxIdle" value="$redis.maxIdle"/><!-定义是否自动连接测试 测试当前连接是否可用,如果有问题,则获取新的连接-><property name="testOnBorrow" value="$redis.testOnBorrow"/></bean><!-定义 jedis 工厂模式-><bean id="jedisConnectionFactory" clas

29、s="org.springframework.data.redis.connection.jedis.JedisConnectionF actory" ><!-定义主机-><property name="hostName" value="$redis.host"/><!-定义端-><property name="port" value="$redis.port"/><!-引入配置文件-><property name=&quo

30、t;poolConfig" ref="poolConfig"/></bean><!-定义 redisTemplate 方便操作 redis -><bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"><property name="connectionFactory" ref="jedisConnectionFact

31、ory"/></bean></beans>江-5271-61772培优2.3实现商品分类缓存处理2.3.1 需求分析说明:当点击商品分类列表时,应该使用 redis 缓存,parentId 充当 redis 中的 Key,获取当前节点的全部子节点信息充当 value(JSON 串)实现思路:1. 根据 parentID 先redis 缓存13/获取数据public String get(String key) ValueOperations<String, String> operations=redisTemplate.opsForValu

32、e();return operations.get(key);/数据public boolean set(String key,String value) ValueOperations<String, String> operations =redisTemplate.opsForValue();try operations.set(key, value); return true; catch (Exception e) e.printStackTrace(); return false;/缓存定义超时时间为秒public boolean set(String key,Stri

33、ng value,Long expireTime) try ValueOperations<String, String> operations = redisTemplate.opsForValue();operations.set(key, value, expireTime, TimeUnit.DAYS); return true; catch (Exception e) e.printStackTrace(); return false;江-5271-61772培优2. 如果 redis 中有数据,则 JSON 串转化为 java 对象之后返回.3. 如果 redis 中没

34、有数据.则数据库,需要将 javaList 集合转化为 JSON 串.之后保存到 redis 中.之后返回用户.2.3.2 编辑 Controller说明:redis 缓存服务2.3.3 编辑 Service14Overridepublic List<EasyUITree> findItemCatCache(Long parentId) List<EasyUITree> treeList = null;String key = "ITEM_CAT_"+parentId; String jsonData = jedis.get(key); try if

35、(StringUtils.isEmpty(jsonData)/缓存中没有数据,需要数据库 treeList = findItemCatList(parentId); String json =objectMapper.writeValueAsString(treeList); jedis.set(key,json);System.out.println("第一次");return treeList;else/缓存中有数据id.,EasyUITree trees = objectMapper.readValue (jsonData,EasyUITree.class); tre

36、eList = Arrays.asList(trees); System.out.println("缓存"); catch (Exception e) e.printStackTrace();RequestMapping("/list") ResponseBodypublic List<EasyUITree> findItemCatList( RequestParam(defaultValue="0",value="id")Long parentId)/一级商品分类目录/Long parentId =

37、0L; List<EasyUITree> treeList =itemCatService.findItemCatCache(parentId);return treeList;江-5271-61772培优2.3.4 适用 Redis 效果展现1. 在没有添加 redis 缓存条件下如图-8 所示图- 82. 在使用 redis 缓存条件下通过下图可以发现使用 redis 时速度提升明显.提升超过 10 倍.由此可见redis 的性能异常快速.如图-9 所示图- 92.4关于 ObjectMapper 使用方法2.4.1 引入 jar 包在经常需要将对象转化 JSON,将 JSON

38、 转化为对象.所以必须使用工具类的方式进行.ObjectMapper 是 jackson 中提供的工具类.15<!- Jackson Json 处理工具包 -><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.2</version></dependency>return treeList;江-5271-61772培优2.4.2 将对象与 JSON 互转2.4.3 将 Li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论