Redis个人心得笔记(三)

                             Redis个人心得笔记(三)


目录

                             Redis个人心得笔记(三)

一.指令笔记  

 独门秘籍

二.通过JAVA实现Redis的缓存

1.java代码连接redis

2.连接java客户端到redis服务案例

3.测试结果

4.Easymall中实现

六.连接池还是不够方便,法宝不完美,那我们就升级为神奇  工具类

七.Redis有三高(互联网)

                           高性能,高并发,高可用


一.指令笔记  


 独门秘籍

启动    redis-cli  -p 端口  6380

mima   auth密码



redis-server 启动图片 

keys *  查看所有的值

set name xxxx  写入值

get name 拿到值 

直接覆盖  修改 

del XXX   删除

set bomb tnt EX  xxxx   毫秒后节奏

exists name   判断 name 是否存在   速度快 

Value 上限  512M 

type  xxx   查看类型

lpush xxxx   "....."   list类型

sadd xxxx  "....."    set

zadd xxx   "....."     zset

 set   name     xxxxx     NX  在不存在的时候生效

save  持久化  

flushall  清空缓存 

111.67.197.140  云主机

shutdown  停止

quit   推出

rm -f 文件名  

dunp.rdb sava保存的信息

incr 自增   decr 递减 

incrby 多个自增  decrby 多个递减

expire xxx             设置时常

ttl xxx 查询存储时间   -1 永久保存

pttl xxx

append  xxxx   追加

Haxh方面
  user 代表属性
hset 对象  参数  值 

hset user age 18  写入

hget user age   读取

exists   user xxx  

hmset  批量 添加

hmget  批量获取

Hdel   key  field    删除

hkey user   获取所有属性

hvals  user  获取所有属性值

hlen   user  获取属性个数   

hincrby user age 5  自增加五 前提 属性是数子类型

List方面

lpush list01 100 200 300   插入数据


rpush list01 100 200 300   插入数据   向下 右

lrange list01  0 10   查询 0-10条数据  -1 查询所有

linsert list01 before  100 two   在一百后面插入two

linsert list01 after  100 two   在一百后面插入two

lset list01 0 222   替换 索引0 换222

lrem list01 2 200  大于0从上往下 小于相反  等于 全删

ltrim list01 0 2   保存三个数据   (登陆账号 最多几次设置)

lpop 头 rpop  未   秒杀  删除(超卖)

rpoplpush  交互  删除一个集合的数据 暂存到第二个集合的头 

set方面 
favor  属性

sadd favor xxx xxx  xxx   添加属性值

srem favor xxx  删除

scard favor  返回个数

sismember favor xxx  查看 xxx 在不在其中

srandmember favor 2  随机抽取俩个

semebers  获取所有信息

sinter  xxx  xxx  查询交集信息

sunion 并集

sdiff  差集

Zset方面

zadd user01 10 ly   添加属性 给与分数

zscore user01 ly  查询该参数的分数

zrank  user01 xxxx  计算排名

zrem 删除

zincrby ZHENGJIA 






二.通过JAVA实现Redis的缓存

1.java代码连接redis

使用jedis连接redis,需要提供依赖  Maven本地库老是jar冲突恶心人

springboot--spring-boot-starter-redis

                  org.springframework.boot

                  spring-boot-starter-redis

                  1.4.7.RELEASE

2.连接java客户端到redis服务案例

Redis个人心得笔记(三)_第1张图片

3.测试结果

Redis个人心得笔记(三)_第2张图片

4.Easymall中实现

easymall中使用redis的java客户端进行缓存逻辑的调用

需求:查询某个商品数据,使用缓存数据返回响应;

 请求发送之后,到达系统中,利用jedis对象连接redis实现缓存功能

1 生成商品对象的缓存key-value中调用数据的key

key值设计="业务逻辑"+"业务id"

2 判断缓存是否存在这个key值

如果有key值:说明曾经至少访问过一次,已经从数据库中将数据查询并且存放到缓存.

如果没有key值:需要调用数据库持久层封装product对象,并且存放到缓存供后续访问使用.

@Autowired
    private ShardedJedisPool pool;   //连接池的
	public Product queryById(String productId) {  
		//创建一个连接对象使用来操作redis缓存技术
		ShardedJedis jedis=pool.getResource();   //获取链接
		//Jedis jedis=new Jedis("10.42.60.249",6381);  //云主机
		//生成当前业务逻辑的key值,业务信息+productId
		String productKey="product_"+productId;   //接收的ID
		//想办法将product序列化成String的json字符串,使用jackson的api
		ObjectMapper mapper=new ObjectMapper();
		try{
			//判断缓存数据是否存在
			if(jedis.exists(productKey)){//表示可以使用缓存
				//Map productMap = jedis.hgetAll(productKey);
				//JSON字符串解析反序列化
				String json=jedis.get(productKey);   //拿到值 存字符串
				Product product=mapper.readValue(json, Product.class);  //转化成json
				return product;
			}else{//商品key不存在,需要访问数据库,将数据存放redis
				Product product=productMapper.queryById(productId);
				//cong product对象映射到json字符串 writeValueAsString"":""
				String json=mapper.writeValueAsString(product);  //转化成JSON格式
				System.out.println(json);//{"":"","":"","":""}
				//将json存储到redis中
				jedis.set(productKey, json);
				return product;
			}
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}finally{
			pool.returnResource(jedis);  //归还链接
		}	
}

系统中直接使用jedis对象new出来访问缓存技术存在的问题   用一次NEW一次太恶心 浪费资源所以我们就有了连接池这个法宝

1 不能在系统中new的代码(框架解决)

2 缓存结点只存在一个,非高并发,高压力的使用环境,在商品查询功能中一定使用高并发的集群

五.链接池配置

package com.jt.easymall.config;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;

/**
 * 在当前工程扫描范围之内的configuration配置类
 * 读取前缀是redis的所有key值,根据私有属性名称的getter/stter
 * 赋值给属性
 * @author TEDU
 *
 */
@Configuration
@ConfigurationProperties(prefix="redis")
public class RedisCumConfiguration {
	//根据前缀读取数据,私有属性名称,必须和
	//properties中的值相同
	private String nodes;
	private Integer maxTotal;
	private Integer maxIdle;
	private Integer minIdle;
	
	//编写初始化JedisShardPool对象的方法,@Bean将返回对象
	//作为框架管理的bean
	@Bean 
	public ShardedJedisPool initJedisPool(){
		//利用本类中读取的属性,创建连接池对象
		//先做一个config对象
		GenericObjectPoolConfig config=new GenericObjectPoolConfig();
		config.setMaxIdle(maxIdle);
		config.setMaxTotal(maxTotal);
		//config.setMinIdle(minIdle);
		//解析nodes,生成一个list对象
		//准备一个空内容
		List infoList=new ArrayList();
		String[] node = nodes.split(",");//{"10.9.9.9:6379","10l.9.9.9:6380",""}
		for (String hostAndPort : node) {
			String host=hostAndPort.split(":")[0]; 
			int port=Integer.parseInt(hostAndPort.split(":")[1]);  //字符串强转int类型的  
			infoList.add(new JedisShardInfo(host, port)); //存储进去
		}
		//list,config,构造连接池对象返回
		return new ShardedJedisPool(config,infoList);
	}
	
	
	public String getNodes() {
		return nodes;
	}
	public void setNodes(String nodes) {
		this.nodes = nodes;
	}
	public Integer getMaxTotal() {
		return maxTotal;
	}
	public void setMaxTotal(Integer maxTotal) {
		this.maxTotal = maxTotal;
	}
	public Integer getMaxIdle() {
		return maxIdle;
	}
	public void setMaxIdle(Integer maxIdle) {
		this.maxIdle = maxIdle;
	}
	public Integer getMinIdle() {
		return minIdle;
	}
	public void setMinIdle(Integer minIdle) {
		this.minIdle = minIdle;
	}	
}

六.连接池还是不够方便,法宝不完美,那我们就升级为神奇  工具类

package com.jt.easymall.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Component
public class RedisCumUtils {
	@Autowired
	private ShardedJedisPool pool;
	//query,addOrUpdate,delete,isExists
	public String query(String key){
		ShardedJedis jedis = pool.getResource();
		try{
			return jedis.get(key);
		}catch(Exception e){
			//异常处理逻辑
			return null;
		}finally{
			pool.returnBrokenResource(jedis);
		}
	}
	public void addOrUpdate(String key,String value){
		ShardedJedis jedis = pool.getResource();
		try{
			jedis.set(key, value);
		}catch(Exception e){
			//异常处理逻辑
		}finally{
			pool.returnBrokenResource(jedis);
		}
	}
	public void delete(String key){
		ShardedJedis jedis = pool.getResource();
		try{
			jedis.del(key);
		}catch(Exception e){
			//异常处理逻辑
		}finally{
			pool.returnBrokenResource(jedis);
		}
	}
	public Boolean isExist(String key){
		ShardedJedis jedis = pool.getResource();
		try{
			return jedis.exists(key);
		}catch(Exception e){
			//异常处理逻辑
			return false;
		}finally{
			pool.returnBrokenResource(jedis);
		}
	}
}




七.Redis有三高(互联网)

                           高性能,高并发,高可用

你可能感兴趣的:(Redis,Redis)