什么是redis (C)
reids是一个nosql数据库,中文:非关系型数据库
nosql(not noly sql):不仅仅只有数据库
关系型数据库:以二维表形式存储数据
非关系型数据库:以键值对(key,value)存储数据redis是将数据存放到内存中,由于内存存取速度快,所以redis被广泛应用于互联网项目中,
redis优点:存取速度快,操作具有原子性(保证高并发)
缺点:对持久化支持不够良好
所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用。redis应用领域
分布式锁
分布式缓存
分布式session session共享(不存服务器端了,直接取出来存到redis中,每回读取)
保存博客或者论坛的留言回复等
总之是用在数据量大,并发性高的情况下
//分布式:一个业务分拆多个子业务,部署在不同的服务器上
集群:同一个业务,部署在多个服务器上linux配置VMnet8. SecureCRT运行命令下载C++编译器。将redis压缩包上传到lunix。解压,编译。运行服务端,改conf改成后端运行,运行客户端存取,关闭客户端
启动:/usr/local/redis/bin 下运行./redis-server & (后台运行)怎么用
redis主要就是使用命令来进行操作,java端在代码中可以使用Jedis来操作redis服务器
redis数据类型:- 字符串String:
set get del incr(数值+1) incrby(数值+指定值) decr(减) decrby
应用:商品编号,订单号采用string的递增数字特性生成 - 列表list:
redis中使用的是双向循环链表来实现的,很像栈,可从左或右添加
LPUSH key value… RPUSH key value… 从左或从右添加(像栈)
LRANG key start stop(按索引从start查看到stop,stop=-1时代表最后一个素)
LPOP key… RPOP key…. 从左或从右弹出元素
LLEN key 获取列表中元素的个数
应用:商品评论列表,评论信息。 - 散列hash:
一个对象可以又多个string字段
HSET key field value…. 设置字段且赋值(可以多个直接跟着写)
HGET key field 取字段值(可以多个,同上)
HGETALL key 取字段及字段值
HDEL key filed 删除字段
应用:一般应用于将redis作为分布式缓冲时,存储数据库中的数据对象 - 集合set:
set中数据是无序且不重复的(hash表实现的应该)
SADD key member… 增加元素,可以多个
SREM key member… 删除元素,可以多个
SMEMBERS key 获取key这个set的所有元素
SISMEMBERS key member 判断元素是否在这个set中.返回1在0不在
SDIFF key1 key2 集合1和2做差集运算
SINTER key1 key2 交集运算
SUNION key1 key2 并集运算
应用:共同好友,共同粉丝等(交集) - 有序集合zset:
redis会根据score(自己添加的数值吧)排序。可以用在成绩,销量等需要排序的数据上
ZADD key score member …. 添加元素分数及元素
ZSCORE key member 获取元素的分数
ZREM key member… 删除元素
ZRANGE key start stop [withscores] 获取某个范围内的元素排名,加withscores就是把分数也获取了,不影响排名,排名已经排好了
ZREVRANG key start stop [withscores] 从大到小排 - Java自定义对象:
1.散列hash ?
2.利用Jedis+序列化工具,将value(对象)序列化为二进制数组,存储到redis中,提取时再反序列化。
利用序列化这样存取更快,并且内存空间占用极少。
- 字符串String:
redis高级特性:
redis的单个command都是原子性的,原因是大部分情况下(不考虑redis 3.x版本的某些情况下使用了多线程),redis是单进程单线程的,客户端的命令请求会被排队加入到一个内部queue中,redis会按顺序执行它们并返回。因此多个客户端并发请求也是没问题的。
// redis的实现类似与node队列。expire 设计键的生存时间,到期后自动删除
expire key second(秒)
ttl 查看键的剩余生存时间
persist 取消生存时间
应用场景: 限时的优惠活动信息 网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜) 手机验证码 限制网站访客访问频率SETNX:设置一个key,不存在就设置,并且返回1,存在就不设置什么也不做。
- delete :删除 key
- SETNX,expire,delete一起配合使用,实现分布式锁。SETNX通过设置key获取锁,expire设置锁的自动过期时间(防止锁释放失败,避免死锁),delete释放锁
- redis事务控制(不提供回滚,可结合watch使用)
redis事务是基于先进先出队列实现的,multi之后的命令放入队列中,exec后队列中的命令一次执行。
它不满足原子性(会部分不执行)、持久性(因为redis是在内存中、即使开启AOF,也存在命令执行一部分后,系统宕机而导致数据丢失的情况,不能恢复)、一致性(状态转移一半宕机了)。因为redis是单线程的,事务也是串行执行,所以满足隔离性。
multi 事务开始
exec 事物结束
discard 放弃事物
1:语法错误:致命的错误,事务中的所有命令都不会执行,即插入到队列时出错,队列所有的命令就都不执行了。
2:运行错误:不会影响事务中其他命令的执行,即插入队列都成功,但从队列出来运行时出错,其他命令还会执行。 - watch:命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令
(事务中的命令是在EXEC之后才执行的,EXEC命令执行完之后被监控的键会自动被UNWATCH) - pipeline 管道
redis的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的。
在插入更多数据的时候,管道的优势更加明显,插入数据更快。
Pipeline pipelined = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pipelined.set(“bb” + i, i + “bb”);
}
pipelined.sync();
redis持久化方案:(DBA做的事)
rdb: 可以设置经过多长时间保存到硬盘一次。(redis默认的持久化方案)通过快照完成的
就是一段时间保存到硬盘一次。
优点:让redis的数据存取速度保持快(硬盘存取慢)
缺点:服务器断电时会丢失部分数据(没到保存时间的就丢失了),数据的完整性得不到保证。
aof:实时保存。
可以通过设置redis.conf 设置实时保存。
有点:持久化良好,保证数据完整性。
缺点:大大降低了redis 系统的存取速度,性能就没那么好了(和关系型数据库不就一样了)
主从复制
从redis服务器用来做备份,实时向主redis发送命名,询问其是否出错,如果得不到回应其就暂时代替主redis,但它只能做读取操作,不能做增删改,要保证主从数据的一致性。从的数据来源:
设置好之后
主发送RDB文件给从
从将文件保存到磁盘上,然后加载到内存恢复
新生成的数据时主把缓存的命令转发给从,从进行操作(这样发送数据量比直接发数据小)。
所以从上位不时不能做增删改,只能读取。主好了之后还是主。