1-redis简介
1-分布式缓存对比
|
|
Redis |
memcached |
|
数据类型 |
string(字符串) hash(哈希) list(列表) set(集合) zset(sorted set 有序集合) |
string(字符串) |
|
持久化 |
RDB AOF |
内存 |
|
速度 |
快 1、纯粹内存操作 2、数据结构简单 3、采用单线程,避免了不必要的上下文切换和竞争条件 4、使用多路I/O复用模型,非阻塞IO |
相对慢 memcached就是在内存中维护一张巨大的hash表,通过自己的一套路由算法来维护数据的操作 |
redis IO 模型:
【我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。】
2-redis-基本数据类型/结构
|
|
string |
list |
hash |
set |
zset |
|
常见命令 |
get 、 set 、 del 、 incr、 decr |
lpush,rpop,brpop,llen,lrange,ltrim |
hget 、hset 、 hdel |
sset 、srem、scard、smembers、sismember |
zadd 、 zrange、 zscore |
|
数据结构 |
SDS |
双链表 压缩列表(类数组) |
哈希表 压缩列表 |
哈希表 整数集合 |
跳跃表 压缩列表 |
|
使用场景 |
1.缓存 2.计数器 3.session 4.限速(计数器) |
lpush+lpop=Stack lpush+rpop=Queue lpush+ltrim=Capped Collection lpush+brpop=MQ |
1.缓存(对象) |
1.标签 2.点赞,或点踩
|
1.排行榜 |
命令参考:http://doc.redisfans.com/
参考文档
3-redis-过期策略
https://blog.csdn.net/qq_41864967/article/details/88424532
redis设置过期时间:
expire key time(以秒为单位)--这是最常用的方式
setex(String key, int seconds, String value)--字符串独有的方式
注:
除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间
如果没有设置时间,那缓存就是永不过期
如果设置了过期时间,之后又想让缓存永不过期,使用persist key
redis过期策略:
a.定时删除 含义:设置key的过期时间的同时,为该key创建一个expire定时器,定时删除 优点:保证内存被尽快释放 缺点:若过期key很多,删除这些key会占用很多的CPU时间,性能影响严重
b.懒汉式删除 含义:key过期的时候不删除,获取值的时候去检查是否过期,若过期,则删除)。 优点:删除操作只发生在通过key取值的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步 缺点:大量key在超出超时时间后,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)
c.定期删除 含义:每隔一段时间执行一次删除过期key操作 优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用 缺点:在内存友好方面,不如"定时删除";在CPU时间友好方面,不如"懒汉式删除"
4-redis-内存淘汰机制:
内存淘汰机制:
1)noeviction:当内存不足,新写入操作会报错。
2)allkeys-lru:当内存不足,在键空间中,移除最近最少使用的key。推荐使用。
3)allkeys-random:当内存不足,在键空间中,随机移除某个key。
4)volatile-lru:当内存不足以,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
5)volatile-random:当内存不足,在设置了过期时间的键空间中,随机移除某个key。依然不推荐
6)volatile-ttl:当内存不足,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐
5-redis-持久化
https://www.cnblogs.com/haoprogrammer/p/11068396.html
6-redis-事务和锁
(*)什么是事务?Transaction
https://www.cnblogs.com/huanongying/p/7021555.html
事务是一组原子操作,不能再分。要么都成功,要么都失败
事务由一组DML(Data Manipulation Language数据操作语言:insert update delete)语句组成
举例:银行转账 MySQL数据库
start transaction; ---> MySQL事务开启方式是手动开启
update useraccount set money=money-100 where name='张三';
update useraccount set money=money+100 where name='李四';
commit; 如果错误:rollback;
事务的特性:原子性、一致性、持久性、隔离性
(*)Redis中事务不是真正的事务,本质:将一组操作放入一个队列中,统一执行
补充:Oracle数据库中,事务本质是:如果DML操作成功写入日志,就算事务操作成功。
(*)对比Oracle和Redis事务
Oracle Redis
开启事务:自动开启 multi命令
操作: DML操作 Redis命令: set incr incrby***
提交: commit exec命令
回滚: rollback discard命令
(*)Redis事务举例1:从tom---> 100 ---> mike账号
set tom 1000
set mike 1000
multi
decrby tom 100
incrby mike 100
exec
(*)Redis事务举例2:买票
set tom 1000
set ticket 1
multi
decrby tom 100
decr ticket
exec -----> 提交操作慢了一点,票被别人买走了
7-redis-分布式锁
分布式锁:分布式模型下,对共享资源互斥访问;实现由很多种,文件锁、数据库、redis等等
Redis分布式锁:1-使用set的命令,同时设置锁和过期时间;2-Redission
set参数: set key value [EX seconds] [PX milliseconds] [NX|XX] EX
seconds:设置失效时长,单位秒
PX milliseconds:设置失效时长,单位毫秒
NX:key不存在时设置value,成功返回OK,失败返回(nil)
XX:key存在时设置value,成功返回OK,失败返回(nil)
127.0.0.1:6379> set unlock "234" EX 100 NX
(nil)
127.0.0.1:6379>
127.0.0.1:6379> set test "111" EX 100 NX
OK
8-redis-主从复制
https://www.cnblogs.com/haoprogrammer/p/11077121.html

浙公网安备 33010602011771号