目录
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
使用jedis连接redis,需要提供依赖 Maven本地库老是jar冲突恶心人
springboot--spring-boot-starter-redis
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);
}
}
}