redis缓存&redis入门

1.什么是缓存

1.1 缓存机制

引入缓存实际上就是降低了用户访问数据的频次.同时缓存中的数据就是数据库中的数据,将来要保证数据的一致性.提高了用户查询的效率.

1.2 实现缓存需要考虑的问题

  1. 存储结构 k-v key不能重复
  2. 开发语言 C
  3. 缓存数据都保存到内存中
  4. 将内存中的数据定期持久化到本地磁盘中
  5. 定期对内存数据优化
    LRU算法:可以将内存中不经常使用的数据提前删除
    LFU算法:可以将内存中使用次数最少的数据提前删除

2.Redis

2.1 Redis介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets),并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
Redis性能
读:11.2万/秒
写:8.6万/秒
平均: 10万/秒 吞吐量

2.2 Redis安装和使用

2.2.1上传redis压缩包文件

到:src目录中,并解压
在这里插入图片描述

2.2.2 安装:

在redis的根目录中运行
命令:
1.make 表示编译文件
2.make install 表示安装redis服务.

执行make MALLOC=libc 如下:
在这里插入图片描述
在这里插入图片描述

2.2.3编辑配置文件

vim redis.conf
  1. 去除ip绑定
    在这里插入图片描述
  2. 关闭保护模式
    在这里插入图片描述
  3. 开启后台启动
    在这里插入图片描述

2.2.4 启动/关闭Redis

`Redis-server redis.conf`  目的读取配置文件
`redis-cli –p  6379` 进入客户端
exit     退出客户端,或者 Ctrl+C
`redis-cli -p 6379 shutdown` 关闭redis
kill -9 PID PID2
redis-cli shutdown  简化命令

2.3Redis命令

2.3.1 String类型

命令说明案例
set添加key-valueset username admin
get根据key获取数据get username
strlen获取key的长度strlen key
exists判断key是否存在exists name 返回1存在 0不存在
del删除redis中的keydel key
Keys用于查询符合条件的keykeys * 查询redis中全部的key;keys n?me 使用占位符获取数据;keys nam* 获取nam开头的数据
mset赋值多个key-valuemset key1 value1 key2 value2 key3 value3
mget获取多个key的值mget key1 key2
append对某个key的值进行追加append key value
type检查某个key的类型type key
select切换redis数据库select 0-15 redis中共有16个数据库
flushdb清空单个数据库flushdb
flushall清空全部数据库flushall
incr自动加1incr key
decr自动减1decr key
incrby指定数值添加incrby 10
decrby指定数值减decrby 10
expire指定key的生效时间 单位秒expire key 20 key20秒后失效
pexpire指定key的失效时间 单位毫秒pexpire key 2000 key 2000毫秒后失效
ttl检查key的剩余存活时间ttl key
persist撤销key的失效时间persist key

2.3.2 Hash类型

说明:可以用散列类型保存对象和属性值
例子:User对象{id:2,name:小明,age:19}

命令说明案例
hset为对象添加数据hset key field value
hget获取对象的属性值hget key field
hexists判断对象的属性是否存在HEXISTS key field 1表示存在 0表示不存在
hdel删除hash中的属性hdel user field [field …]
hgetall获取hash全部元素和值HGETALL key
hkyes获取hash中的所有字段HKEYS key
hlen获取hash中所有属性的数量hlen key
hmget获取hash里面指定字段的值hmget key field [field …]
hmset为hash的多个字段设定值hmset key field value [field value …]
hsetnx设置hash的一个字段,只有当这个字段不存在时有效HSETNX key field value
hstrlen获取hash中指定key的长度HSTRLEN key field
hvals获取hash的所有值HVALS user

2.3.3 List类型

说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同

命令说明案例
lpush从队列的左边入队一个或多个元素LPUSH key value [value …]
rpush从队列的右边入队一个或多个元素RPUSH key value [value …]
lpop从队列的左端出队一个元素LPOP key
rpop从队列的右端出队一个元素RPOP key
lpushx当队列存在时从队列的左侧入队一个元素LPUSHX key value
rpushx当队列存在时从队列的右侧入队一个元素RPUSHx key value
lrange从列表中获取指定返回的元素LRANGE key start stop Lrange key 0 -1 获取全部队列的数据
lrem从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:• count > 0: 从头往尾移除值为 value 的元素。• count < 0: 从尾往头移除值为 value 的元素。• count = 0: 移除所有值为 value 的元素。LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。
Lset设置 index 位置的list元素的值为 valueLSET key index value

2.3.4 Redis事务命令

说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.

命令说明案例
multi标记一个事务开始127.0.0.1:6379> MULTI OK
exec执行所有multi之后发的命令127.0.0.1:6379> EXEC OK
discard丢弃所有multi之后发的命令

3. Redis入门

3.1创建测试类

package com.jt;

import org.junit.Test;
import redis.clients.jedis.Jedis;
public class TestRedis {
	@Test
	public void test() {
		Jedis jedis = new Jedis("192.168.211.130",6379);
		jedis.set("tom", "forrest");
		System.out.println("jedis:"+jedis);
		//为数据设定超时时间  单位秒
		jedis.setex("admin", 10, "aphace");
		String s = jedis.get("tom");
		System.out.println(s);
	}
}

启动redis测试。
在这里插入图片描述
测试-hash

@Test
public void test() {
	Jedis jedis = new Jedis("192.168.211.130",6379);
	jedis.hset("user","id", "12");
	jedis.hset("user","name","hank");
	jedis.hset("user", "age","24");
	Map<String, String> map = jedis.hgetAll("user");
	System.out.println(map);
}

测试——list

@Test
public void test2() {
	Jedis jedis = new Jedis("192.168.211.130",6379);
	Long number = jedis.lpush("list", "a","b","c","d","e");
	List<String> l = jedis.lrange("list", 0, -1);
	System.out.println(l);
}

添加before注解

private Jedis jedis;
//执行test方法之前先执行@Before	
@Before
public void init() {
	String host = "192.168.211.130";
	int port = 6379;
	jedis = new Jedis(host, port);
}

事务控制

@Test
public void testTx() {
	//开启事务
	Transaction transaction = jedis.multi();
	try {
		transaction.set("cc", "cc");
		//提交事务
		transaction.exec();
	} catch (Exception e) {
		//事务回滚
		transaction.discard();
	}
}

3.2 SpringBoot整合Redis

  1. 导入jar包
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-redis</artifactId>
</dependency>

3.3 对象转化为json

  1. 利用ObjectMapper实现对象的转化
ObjectMapper mapper = new ObjectMapper();
//对象转化为JSON
String json串 = mapper.writeValueAsString(对象);
//JSON转化为对象
对象  T =  mapper.readValue(json, 对象.class);

public class TestObjectToJson {
	private ObjectMapper object = new ObjectMapper();
	/**
	 * 问题:对象转化为json时,依赖对象的哪些方法?
	 * 依据:每个对象中必须要get/set
	 * @throws IOException 
	 */
	@Test
	public void test() throws JsonProcessingException {
		ItemDesc itemDesc = new ItemDesc();
		itemDesc.setItemId(11L)
				.setItemDesc("设置信息")
				.setCreated(new Date())
				.setUpdated(itemDesc.getCreated());
		String json = object.writeValueAsString(itemDesc);
		System.out.println("json:"+json);
		
		ItemDesc obj = object.readValue(json, ItemDesc.class);
		System.out.println("对象:"+obj);
	}
}

3.4 List与JSON互转

/**
* List集合转化为JSON
 * @throws JsonProcessingException 
 * @throws IOException 
 */
@SuppressWarnings("unchecked")
@Test
public void testToList() throws JsonProcessingException {
	ItemDesc itemDesc1 = new ItemDesc();
	itemDesc1.setItemId(100L).setItemDesc("测试1");
	ItemDesc itemDesc2 = new ItemDesc();
	itemDesc2.setItemId(200L).setItemDesc("测试2");
	List<ItemDesc> itemList = new ArrayList<>();
	itemList.add(itemDesc1);
	itemList.add(itemDesc2);
	String json = object.writeValueAsString(itemList);
	System.out.println(json);
	
	//json转化为list
	List<ItemDesc> itemDescList = object.readValue(json, itemList.getClass());
	System.out.println(itemDescList);
}

执行结果:

json:[{"created":null,"updated":null,"itemId":100,"itemDesc":"测试1"},{"created":null,"updated":null,"itemId":200,"itemDesc":"测试2"}]
List集合:[{created=null, updated=null, itemId=100, itemDesc=测试1}, {created=null, updated=null, itemId=200, itemDesc=测试2}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值