redis缓存&redis入门
1.什么是缓存
1.1 缓存机制
引入缓存实际上就是降低了用户访问数据的频次.同时缓存中的数据就是数据库中的数据,将来要保证数据的一致性.提高了用户查询的效率.
1.2 实现缓存需要考虑的问题
- 存储结构 k-v key不能重复
- 开发语言 C
- 缓存数据都保存到内存中
- 将内存中的数据定期持久化到本地磁盘中
- 定期对内存数据优化
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
- 去除ip绑定
- 关闭保护模式
- 开启后台启动
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-value | set username admin |
get | 根据key获取数据 | get username |
strlen | 获取key的长度 | strlen key |
exists | 判断key是否存在 | exists name 返回1存在 0不存在 |
del | 删除redis中的key | del key |
Keys | 用于查询符合条件的key | keys * 查询redis中全部的key;keys n?me 使用占位符获取数据;keys nam* 获取nam开头的数据 |
mset | 赋值多个key-value | mset 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 | 自动加1 | incr key |
decr | 自动减1 | decr 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元素的值为 value | LSET 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
- 导入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
- 利用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}]