redis应用
优点:
降低后端负载,查询压力
提高读写效率,降低响应时间
缺点:
数据一致性成本,mysql如果改变了数据,redis如何同步修改
代码维护成本—代码复杂度
运维成本–redis花钱比es贵,雪崩问题等等
redis
》nosql
非关系型数据库
基于内存的key-value形式
与sql区别:非结构化、无关联的(每个key只要求不同,实际互不干扰)、非sql、没有acdi事务。
单线程、每个命令具备原子性
低延迟、速度快(百万级别)----亮点
支持数据持久化
支持主从集群、分片集群
通用命令:keys (数据量大慎用)
del
exists
expire(有效期)
ttl(查看剩下有效期)
经典五种基本类型
String
string
int
float
字符串最大空间不超过512m
指令
set
get
mset
mget
incr
incrby
incrbyfloat
setnx
setex
可以用:隔开命名
规范 项目名:业务名:类型:id
hash
value是无序字典
类似java hashmap
CRUD单个字段更容易
命令
hset
hget
hmset
hmget
hgetall
hkeys(数据量大慎用)
hvals
hncrby
hsetnx
List
与java linkedlist类似,双向链表,支持正向反向检索
有序
可重复
插入,删除快
查询一般
应用场景:朋友圈点赞列表、评论列表
命令
lpush
lpop
rpush
rpop
lrange
blpop
brpop
补充:队列 先进先出
栈 先进后出
set
与hashset类似
无序
元素不可重复
查找快
支持交集、并集、差集(相对来说SQL实现比较复杂,所以用redis更简洁)
命令
sadd
srem 移除指定
scard 元素个数
sismember 判断一个元素是否存在set中
smembers 所有
sinter 交集
sdiff 差集
sunion 并集
sortedset
可排序set 与treeset类似
元素不重复
查询速度快
应用:排行榜
命令
zadd
zrem
zscore
zrank
zcard
zcount
zincrby
zrange
zrangebyscore
zdiff
zinter
zunion
java工具类
spring data redis
jedis lettuce
jedis
1、引入依赖
<dependency> <groupId>redis-clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency>
2、建立连接
private Jedis jedis; @BrforeEach void xx() { jedis = new Jedis("127.0.0.1",6379); jedis.auth("root"); jedis.select(0); }
3、实现
@Test void xx() { String result = jedis.set("name","df"); jedis.get("name"); }
4、释放资源
@AfterEach void xx() { if(jedis != null) { jedis.close(); } }
jedis本身线程不安全—》推荐线程池
public class xxx { private static final JedisPool jedisPool; static { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolconfig.setMaxTotal(8); jedisPoolConfig.setMaxIdle(8); jedisPoolConfig.setMinIdle(0); jedisPoolConfig.serMaxWaitMilis(200); jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 1000, "root"); public static Jedis getJedis() { return jedisPool.getResource(); } } }
SpringDataRedis企业用的多
api
redisTeplate通用
redisTeplate.opsForvalue() String
redisTeplate.opsForHash()
redisTeplate.opsForList()
redisTeplate.opsForSet()
redisTeplate.opsForZSet()
1、引入依赖
<dependency> <groupId>org.springframework-boot</groupId> <artifactId>spring-boot-starter-data-redis</artiactId> </dependency> <dependency> <groupId>org.apache.cmmons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
2、配置
spring:
redis:
host: 127.0.0.1
port: 6379
password: root
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
3/应用
@Autowired private RedisTemplate redisTemplate; @Test public void test() { redisTemplate.opsForValue().set("name","fds"); Object name = redisTemplate.opsForValue().get("name"); sout(name); }
存入的数据\xAC\xED\x00…
可以序列化处理
1、使用StringRedisTemplate
2、Redis写入对象序列化为JSON
3、Reids读取JSON反序列化为对象
@Autowired private StringRedisTemplate stringRedisTemplate; private static final ObjectMapper mapper = new ObjectMapper(); @Test public void test() throws JsonProcessingException { User user = new User(299L,"dfs"); String json = mapper.writeValueAdString(user); String val = stringReditsTemplate.opsForValue().set("user:newUser:" + user.getId()); User result = mapper.redValue(val, User.class); sout(result); } }