Redis是什么
Redis 是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存中。
Redis 是以key-value形式存储的Nosql,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
redis的优势
1.数据保存在内存,存取速度快,并发能力强
2.它支持存储的value类型相对memcached更多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。
3.redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。
4.它提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便。
5.Redis支持集群(主从同步)。数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
6.支持持久化,可以将数据保存在硬盘的文件中
7.支持订阅/发布(subscribe/publish)功能 QQ群
数据存储:
存放到内存中,并且还能不定期持久化到硬盘.
Value类型:
相较于memcached支持Value更多
客户端支持:
支持多种客户端-跨语言
超大并发支持:
支持集群
Mysql、Memcached和Redis的比较
储过期:存储数据时设置一个有效期,时间到了就没了.
场景:订单,vip,短信验证码,游戏道具,优惠券,红包等等
Memcached和Redis的相同点和不同点? Memcached?
相同点:
都是key-value类型Nosql,都存放数据到内存中,读写效率高,而且都支持存储过期.
不同点:
redis相较于Memcached还支持持久化到磁盘,数据安全更高.
redis相较于Memcached支持value类型更多.
redis的使用场景
中央缓存 计数器应用 实时攻防系统 排行榜 设定有效日期 自动去重(set数据结构可自动去重) 队列 消息订阅
在java中使用Redis
首先我们需要导入redis的jar包,(commons-pool2-2.2.jar ,jedis-2.5.2.jar)
然后我们可以准备一个枚举类 获取得到jedis
public enum RedisUtil {
REDIS_POOL;
private static JedisPool pool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);//最大连接数
config.setMaxIdle(4);//最小连接数
pool = new JedisPool(config, "127.0.0.1");
}
public Jedis getjedis(){
return pool.getResource();
}
}
然后我们就可以在测试类中对Redis进行操作了,
普通存值的操作
@Test
public void testJedisStringOper() throws Exception{
Jedis jedis = JeditUtil.INSTANCE.getJedis();
//清空当前数据库
jedis.flushDB();
System.out.println("name这个key是否存在:"+jedis.exists("name"));//false
jedis.set("name","songsong");
System.out.println("name的值:"+jedis.get("name"));//songsong
System.out.println("所有的Key:"+jedis.keys("*"));//[name]
jedis.del("name");
System.out.println("所有的Key:"+jedis.keys("*"));//[]
JeditUtil.INSTANCE.closeJedis();
}
string操作
@Test
public void testJedisString() throws Exception{
Jedis jedis = JeditUtil.INSTANCE.getJedis();
//清空当前数据库
jedis.flushDB();
jedis.set("name","songsong");
System.out.println("name的值:"+jedis.get("name"));//songsong
jedis.append("name","123456");
System.out.println("追加之后的name的值:"+jedis.get("name"));//songsong123456
JeditUtil.INSTANCE.closeJedis();
}
List操作
@Test
public void RedisList1() throws Exception{
//将值赋值进去
jedis.flushDB();//清除当前数据库中的数据
jedis.lpush("list","aa","bb","ss","xx","dd");//会给list集合赋值
SortingParams params = new SortingParams();//设置排序方式
params.alpha();//给字符串修改排序方式
System.out.println( jedis.lrange("list", 0, -1));//读取到具体的数据,o表示从0开始,-1结束
}
/**
set操作
hash的操作
Redis持久化配置
Redis 提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置.
1.1. RDB模式
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
如何关闭 rdb 模式:
save ""
# save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
# save xxx
# save 60 100008
1.2. AOF追加模式
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
如何开启aof模式:
appendonly yes //yes 开启,no 关闭
# appendfsync always //每次有新命令时就执行一次fsync
#这里我们启用 everysec
appendfsync everysec //每秒 fsync 一次
# appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)
其它的参数请大家看redis.conf配置文件详解
淘汰策略
淘汰一些数据,达到redis数据都是有效的,确保内容优化。选择合适的淘汰策略进行淘汰。
1.1. 怎么淘汰
olatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。
当redis存放的数据到达配置的最大内容后,会按照配置淘汰策略进行淘汰.