Redis 是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存中。redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。
非关系型数据库和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,
类型:Redis是非关系型数据库,Mysql是关系型数据库
储存位置:Redis是粗存在内存中,Mysql是存储在磁盘中
存储过期:Redis支持储存过期,Mysql不支持存储过期
读写能能力:Redis非常高,Mysql很低
1.用作中央缓存:对于经常使用的数据,和高频数据可以存放在redis中,大大提高读写能力,类似Mybatis的二级缓存
2.用作计数器:网站的总访问量,注册人数,可能会发生高并发,我们就可以使用redis然后等在一个时间点把数据同步到关系型数据库中。
3.数据过期管理:我们可以在redis中配置数据过期时间,可以应用在验证码,红包,优惠卷登场景
4.实施攻防系统:我们可以在redis中存储同一ip地址,如果对方是使用暴力破解的方式,就会在同一时间大量的访问,我们可以控制同一ip的访问次数,达到安全控制。
5.队列系统:使用场景例如秒杀活动,我们可以将资格放入内存队列(redis)中,达到预防高并发的效果
6.消息订阅:Pub/Sub 构建实时消息系统 Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统 的例子。如QQ群
7.自动去重:reids存储数据中有set数据结构,set是一个无序的,不可重复的集合,我们可以将要去重的数据存在redis的set中,达到去重的目的。
第一部分总结:从认识了解来看,Redis其实不是很难,我们现在已经有一个大致的了解,现在开始我们就要去实践一下,看看这个东西到底怎么用!
下载地址:redis下载地址:http://redis.io/download ; http://redis.cn/
直接win+r启动cmd控制台将redis服务器端拖到黑窗口,输入空格再将redis服务器配置拖到黑窗口回车即可;
看到上面的图片的界面,那么恭喜你,redis服务器就启动成功了!接着双击redis客户端应用,你会看到你的本机ip加上redis的端口号,那么现在我们就可以操作redis了!
首先我们知道redis可以操作很多数据类型,上面已经说到过了,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)
redis是key-value Nosql,我们能操作就只有key,以及各种类型vaule.按照规范我们应该先设置密码,客户端访问之前应该先确定密码,我在后面会给大家讲到如何设置密码。
set name zs //name为key zs为value
get name
mset name zs age 18 //设置两个字符串键值对
mget name age //获取key的name和age的值
incr age // 将age的值自增1
decr age //将age的值自减1
incrBy age 5 // 将age的值自增5
-8.将存储的key的值自增指定数
decrBy age 5 // 将age的值自减5
keys * //查看所有的属性
del name //删除key为name的值
expire name 10 // 设置name的过期时间是10秒后
ttl name //查看name的过期时间
flushall
flashdb
select 0 //查看索引为0的数据库
lpush name zs ls //在key为name的list中存zs和ls两个值
lrange name 0 -1 //查询所有
lrange age 0 2 //查询索引在0到2之间的所有元素
rpush name zs ls//从右往左插入
lpop name
rpop name
lrem name 1 ls //删除names列表左面第一个ls值
lrem name 0 ls //删除names列表中所有的ls值
lrem name -1 ls//删除names列表中右边第一个ls值
lindex name 1 //返回name列表中的下标为1的元素
ltrem name 0 2 //保留name列表下标为0到2之间的元素
set集合是一个无序的不含重复值的队列
sadd name zs ls ws ls //去重之后是 zs ls ws
smembers names //获取说有元素
srem names zs ls //删除names中的zs ls元素
scard name //返回这个集合中所有key的数量
ZSet(sorted sets)在Set基础上增加了“分数”,让set集合有了排序功能
zsadd age 15 ls 19 wu
zcard age
zcount age 18 20 //获取age中年龄在18 到 20岁之间的元素个数
注意下面俩个api适用于5.0版本
zpopmax age 2 //删除年龄最大的2个元素
zpopmin age 2 //删除年龄最小的两个元素
zrange age 15 18 withscores //返回年龄在15 到 18 范围的元素,按从小到大的顺序,并且返回年龄
zrank age ls //返回ls在age集合中的排名从小到大
zrevrank age ls //返回ls在age集合中的排名从大到小
ZRANGEBYSCOREkey heights 0 170 WITHSCORES LIMIT 0 10 //查询heights中0-170分之间的元素,低到高排序,0条开始查询,每页10条
Hash类似于jdk中的Map,一个key下面以键值对的方式存储数据
hset user id 1 //给user这个key设置id=1键值对
hget user id //取userkey 中的id对应的值
hmset user id 1 name ls //给user这个key设置id=1,name=ls多个键值对
hmget user id name //获取多个值
hkeys user //获取所有的字段名称
hvals user
hgetall user
这个注意{ }里面存的是json字符串格式,我们要使用需要将格式转化
set user {id:1,name:ls}
首先,Redis是一个弱性事务的数据库,和刚性事务的数据库如Mysql不太一样,他没有事务特定的原则,一般选择金融类项目的时候不建议使用Redis。
Redis中的事务原理:
首先我们输入命令:multi,类似于commit.但是Redis的操作则是从multi开始记录你的操作命令,但是并没有执行,当你输入exec时开始逐一执行命令操作,当有一个操作报错,则不会回滚事务。结束事务的命令时discard(意思是取消之前的所有操作命令)
因为Redis数据基于内存读写,为了防止Redis服务器关闭或者宕机造成数据丢失,我们通常需要对Redis最磁极化,即:把内从中的数据(命令)保存一份到磁盘做一个备份,当Redis服务关闭或者宕机,在Redis服务器重启的时候会从磁盘重新加载备份的数据,不至于数据丢失。 Redis 提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置.开启持久配置后,对Redis进行写操作,在Redis安装目录将会看到持久文件:“appendonly.aof”和“ dump.rdb”。
redis为了考虑效率,保存数据在内容中.并且考虑数据安全性,还做数据持久化,如果满足保存策略,就会把内存的数据保存到数据rdb文件,还来不及保存那部分数据存放到aof更新日志中。在加载时,把两个数据做一个并集。
虽然配置了持久化Redis会进行自动数据备份,我们也可以通过SAVE 或者 BGSAVE (后台备份)命令创建当前数据库的备份
save //该命令将在 redis 安装目录中创建dump.rdb文件。
Redis的数据读写基于内存,Redis虽然快,但是内存成本还是比较高的,而且基于内存Redis不适合存储太大量的数据。Redis可以使用电脑物理最大内存,当然我们通常会通过设置maxmemory参数现在Redis内存的使用, 为了让有限的内存空间存储更多的有效数据,我们可以设置淘汰策略,让Redis自动淘汰那些老旧的,或者不怎么被使用的数据.redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。
commons-pool2-2.2.jar #连接池
jedis-2.5.2.jar #Jedis核心包
@Test
public void testJedis()throws Exception{
//创建连接
String host ="127.0.0.1";
//端口
int port = 6379;
//超时时间,1秒超时
int timeout = 1000;
//jedis客户端
Jedis jedis = new Jedis(host,port,timeout);
//认证
jedis.auth("123456");
//执行操作,保存值
jedis.set("username","wang da cui");
//获取值
String result = jedis.get("username");
System.out.print(result);
//关闭连接
jedis.close();
}
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.util.Properties;
/**
* 获取连接池对象
*/
public enum RedisUtils {
//使用枚举实现单例
INSTANCE;
//连接池对象
private static JedisPool jedisPool = null;
static {
//初始化链接池
//1 创建连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
//2 进行配置-四个配置
////最小连接数
config.setMaxIdle(1);
//最大连接数
config.setMaxTotal(11);
//链接最长等待时间
config.setMaxWaitMillis(10 * 1000L);
//测试连接时是否畅通
config.setTestOnBorrow(true);
String host = "127.0.0.1";
int port = 6379;
String password = "123456";
int timeout = 10000;
//创建连接池
jedisPool = new JedisPool(config, host,port,timeout, password);
}
//获取连接
public Jedis getSource() {
return jedisPool.getResource();
}
//关闭资源
public void closeSource(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
/**
* 设置字符值
*
* @param key
* @param value
*/
public void set(String key, String value) {
Jedis jedis = getSource();
jedis.set(key, value);
closeSource(jedis);
}
/**
* 设置字符值
*
* @param key
* @param value
* @param seconds :过期时间
*/
public void setex(String key,int seconds, String value) {
Jedis jedis = getSource();
jedis.setex(key,seconds, value);
closeSource(jedis);
}
/**
* 设置字符值
*
* @param key
*/
public String get(String key) {
Jedis jedis = getSource();
try {
return jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeSource(jedis);
}
return null;
}
/**
* 设置
* @param key
* @param value
*/
public void set(byte[] key, byte[] value) {
Jedis jedis = getSource();
jedis.set(key, value);
closeSource(jedis);
}
/**
*
* @param key
* @return
*/
public byte[] get(byte[] key) {
Jedis jedis = getSource();
try {
return jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeSource(jedis);
}
return null;
}
}
Redis的基本概念和常用api都已经总结出来了,下一章我们来说一下集群和分布式,谈一谈Redis集群的特性