Redis,全名RE
mote DI
ctionary S
erver,开源的高性能的KV内存数据库,支持数据持久化。
开源的支持多种数据结构的基于键值的存储服务系统,高性能、功能丰富。
提供了Java , C/C++ , C# , PHP , JavaScript ,Perl, Object-C , Python , Ruby , Erlang等客户端
Redis能读的速度是11w次/s,写的速度是81000次/s。
官方bench-mark数据:测试完成了50个并发执行100000个请求。设置和获取的值是一个256字节字符串。 结果:读的速度是10000次/s,写的速度是81000次/s。redis尽量少写多读,符合缓存的适用要求。单机redis支撑万级, 如果10万+可采用主从复制的模式。
Redis 作为一个进程,一直是多线程的。
Redis 操作都是单线程,原子性的。多线程其实体现在数据解析和同步数据。底层内部的核心操作还是单线程的。
string、hash、list、set、sorted set,raw、int、ht、zipmap、linkedlist、ziplist、intset。
缓存、分布式锁、队列、集合、GEO、BitMap、消息队列等。
1)键的过期时间支持毫秒。 2)从节点支持只读功能。
1)可以用bind命令绑定多个IP地址。 2)发布订阅添加了pub/sub. 3) Redis Sentinel第二版, 相比于Redis2.6的Redis Sentinel, 此版本已经变成生产可用。
Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下: 1)添加GE0相并功能。 2)新的List编码类型: quicklist.
1)提供了模块系统,方便第三方开发者拓展Redis的功能。 2)提供了新的缓存剔除算法: LFU (Last Frequently Used),并对已有算法进行了优化。 3)提供了非阻塞del和flushall/flushdb功能,有效解决删除了bigkey可能造成的Redis阻塞。 4)提供了RDB-AOF混合持久化格式,充分利用了’AOF和RDB各自优势。
1)新的Stream数据类型。 2)客户经常连接和断开连接时性能更好。
SET dlock my_random_value NX PX 30000
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
关键点:原子性、互斥、超时
类似于数据库的存储过程,mongodb的js脚本。 open resty = nginx + lua jit。
直接执行
eval "return'hello java'" 0
eval "redis.call('set',KEYS[1],ARGV[1])" 1 lua-key lua-value
预编译 script load script脚本片段 返回一个SHA-1签名 shastring
evalsha shastring keynum [key1 key2 key3 ...] [param1 param2 param3 ...]
官方客户端,类似于JDBC,可以看做是对redis命令的包装。 基于BIO,线程不安全,需要配置连接池管理连接。
目前主流推荐的驱动,基于Netty NIO,API线程安全。
基于Netty NIO,API线程安全。 大量分布式功能特性,比如JUC的线程安全集合和工具的分布式版本,分布式的基本数据类型和锁等。
核心是 RedisTemplate(可以配置基于Jedis,Lettuce,Redisson) 使用方式类似于MongoDBTemplate,JDBCTemplate或JPA 封装了基本redis命令操作。
引入 spring-boot-starter-data-redis 配置 spring redis
默认使用全局的CacheManager自动集成。
使用ConcurrentHashMap或ehcache时,不需要考虑序列化问题。 使用Redis需要注意