说明:虚拟机的nat模式依赖于net8网卡,nat8网卡的地址是一个网关,在window系统中.window系统访问Linux系统必须通过nat8网卡.不然不能通讯java
说明:该报错信息是因为计算机关闭了虚拟化设置.须要进入bios系统中开启便可F10保存退出.mysql
说明:1.关闭防火墙ios
2.开放mysql对外的访问权限nginx
3.ping 主机IP地址是否成功redis
4.将nat8网卡重启算法
5.安装mysql开始spring
6.保证mysql数据的一致性sql
说明:数据库中虽然实现了主从复制和读写分离.在必定程度上可以抗击高并发,可是性能并非特别的完善.如今所面临的主要问题是用户大量的读的操做所引起的高并发的问题?数据库
如何处理:缓存机制json
说明:缓存机制是下降了客户端访问服务器的访问频次.而且缓存中的数据是与服务器(数据库)中的数据是同步的.
1.缓存的数据如何存储??
2.缓存中的数据如何持久化??
3.缓存中的数据如何实现数据同步??
4.缓存中的数据内存如何维护
1.缓存中的数据可使用Map存储,
由于map的数据结构是key:value. key不容许重复
2.定时将缓存中的数据保存到磁盘文件中.当服务器宕机,先应该读取磁盘持久化文件,恢复缓存的数据.
3.当数据发生”更新”操做时,及时的维护缓存的数据(拦截器/监听器/AOP)
4.设定最大的内存,当内存超过阈值时,采用lru算法删除最近最少使用的数据
说明:redis是现阶段使用量较多的缓存数据库.可以支持300000/秒集合运算.由于底层是基于c语言开发的.
说明:若是出现上述文件表示编译成功
说明:若是出现上图的提示,表示redis安装成功
说明:启动的命令 redis-server
vim redis.conf
4.开启后台启动
redis-server redis.conf
5.关闭redis
Kill -9 9249
redis-cli shutdown
命令:redis-cli 进入客户端
说明:学习redis命令
指令 |
说明 |
案例 |
set |
设定key的值 |
set name tom |
get |
获取指定 key 的值 |
get name |
strlen |
获取key值的长度 |
strlen name |
exists |
检查给定 key 是否存在 |
exists name 返回1存在 0不存在 |
del |
删除指定的key/key1 key2 |
del name1 name2 |
keys |
命令用于查找全部符合给定模式 pattern 的 key |
Keys * 查询所有的key值 Keys n?me 占位符 Keys name* 以name开头的key |
mset |
赋值多个key-value |
mset key1 value1 key2 value2 key3 value3 同时赋值多个值 |
mget |
获取多个key |
Mget key1 key2 key3 |
append |
对指定的key进行追加 |
append key 123456 value123456 append key " 123456" value 123456中间多一个空格 |
Type |
查看key的类型 |
Type key1 127.0.0.1:6379> TYPE key1string |
Flushdb |
清空当前数据库 |
Flushdb 清空数据库 |
Select |
切换数据库 |
Select 0-15 redis一共有16个数据库 |
FLUSHALL |
清空所有数据库数据 |
flushall |
Incr |
自动增加1 |
Incr num 数据会自动加1 Incr string 数据库会报错 |
Decr |
自动减1 |
Decr name 数据会自动减1 |
incrby |
指定步长自增 |
Incrby 2 每次自增2 |
Decrby |
指定步长自减 |
Decrby 2每次减2 |
Expire |
指定key的失效时间单位是秒(s) |
EXPIRE name1 5 5秒后数据失效 |
Ttl |
查看key的剩余存活时间 |
Ttl name -2表示失效 -1没有失效时间 |
Pexpire |
设置失效时间(毫秒) |
Pexpire name 1000 用于秒杀业务 |
Persist |
撤销失效时间 |
撤销失效时间 |
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.1.RELEASE</version> </dependency> <jedis.version>2.6.2</jedis.version> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency>
/** * 1.链接远程redis的客户端 ip:6379 * 2.经过jedis操做数据的增和删 */ @Test public void test01(){ Jedis jedis = new Jedis("192.168.126.142", 6379); jedis.set("name", "jerry"); System.out.println("获取redis中的数据:"+jedis.get("name")); }
<!--Spring管理Jedis name= "构造参数的名称" index="构造参数的位置" 总结:构造注入时使用index不用name.缘由因为java只会维护形参的数据类型 不会维护形参的名称.全部经过name属性进行构造注入时,可能会产生风险. 因此建议使用index. addUser(int age,String sex) addUser(int arg0,String arg1) 因为没有导入源码 关于type类型的说明: 通常状况下,SPring会自动的维护参数类型,因此能够省略不写. 可是若是类中的构造方法重载较多,出现参数个数相同的状况, 须要指定参数类型.Spring根据特定的参数实现构造注入. --> <bean id="jedis" class="redis.clients.jedis.Jedis"> <constructor-arg index="0" value="${redis.host}" type="java.lang.String"/> <constructor-arg index="1" value="${redis.port}" type="int"/> </bean>
1.编辑redis.properties
2.交给Spring容器管理
说明:将变化不大的数据添加到缓存中.
省市县区,部门名称/信息/商品的分类目录
说明:商品分类目录使用redis缓存实现
规定:
步骤:
1.当用户查询数据时,先查询缓存
2.当缓存中没有数据,应该查询后台的数据库
3.将查询的结果转化为JSON串,存入redis中
4.当用户再次查询时,缓存中已经含有该数据
5.将redis中的JSON串转化为List集合
6.将list集合返回
/** * 1.当用户查询数据时,先查询缓存 2.当缓存中没有数据,应该查询后台的数据库 3.将查询的结果转化为JSON串,存入redis中 4.当用户再次查询时,缓存中已经含有该数据 5.将redis中的JSON串转化为List集合 6.将list集合返回 */ @Override public List<ItemCat> findItemCatByParentId(Long parentId) { //建立List集合 List<ItemCat> itemCatList = new ArrayList<ItemCat>(); //定义key 定义前缀保证key不重复 String key = "ITEM_CAT_"+parentId; //从缓存中获取数据 String jsonData = jedis.get(key); try { //判断返回值是否为空 if(StringUtils.isEmpty(jsonData)){ //表示没有缓存 查询数据库 ItemCat itemCat = new ItemCat(); itemCat.setParentId(parentId); itemCat.setStatus(1); //正常的分类信息 itemCatList = itemCatMapper.select(itemCat); //将itemcatList集合转化为JSON串 String resultJSON = objectMapper.writeValueAsString(itemCatList); //将数据存入redis缓存中 jedis.set(key, resultJSON); }else{ //表示redis中含有数据,将JSON数据转化为List集合 ItemCat[] itemCats = objectMapper.readValue(jsonData,ItemCat[].class); //将返回值转化为List集合 itemCatList = Arrays.asList(itemCats); } } catch (Exception e) { e.printStackTrace(); } return itemCatList; }
说明:若是不添加上述的注解则会报错
说明:因为将JSON数据转化为对象时,须要调用其中的setXXX()方法.可是state和text属性是树形结构展示数据时的要求和实际的业务没有关系.因此添加@JsonIgnoreProperties(ignoreUnknown=true)表示忽略未知字段.最终实现对象的转化.
没有使用redis缓存前耗时400毫秒
速度明显提高
1.修改数据文件
2.修改nginx配置文件
<!--经过线程池的方式整合单台redis --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--定义链接的总数 --> <property name="maxTotal" value="${redis.maxTotal}"/> <!--定义最大的空闲数量 --> <property name="maxIdle" value="${redis.maxIdle}"/> <!--定义最小空闲数量 --> <property name="minIdle" value="${redis.minIdle}"></property> </bean> <!--经过工厂模式建立jedis链接 须要指定 host主机 和端口号 引用链接池配置 --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"/> <property name="port" value="${redis.port}"/> <!--引入线程池的配置 --> <property name="poolConfig" ref="poolConfig"/> </bean> <!--配置SpringJedisTemplate spring操做redis的模板工具API --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <!--配置redis工厂 --> <property name="connectionFactory" ref="jedisConnectionFactory"></property> </bean>
redis.host=192.168.126.142
redis.port=6379
redis.maxTotal=1000
redis.maxIdle=30
redis.minIdle=10
@Service public class RedisService { @Autowired //注入spring的模板工具 private StringRedisTemplate redisTemplate; public void set(String key,String value){ ValueOperations<String, String> operations = redisTemplate.opsForValue(); //将数据写入redis中 operations.set(key, value); } //经过key获取数据 public String get(String key){ ValueOperations<String, String> operations = redisTemplate.opsForValue(); return operations.get(key); } }
说明:将jt-common编辑完成以后须要从新进行打包,不然业务层调用不生效
说明:将原有单个jedis的操做改成jedis链接池的形式.性能更好,更加适用于企业开发.