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/

参考文档

Redis数据结构——简单动态字符串SDS
Redis数据结构——链表
Redis数据结构——哈希表
Redis数据结构——整数集合
Redis数据结构——跳跃表
Redis数据结构——压缩列表
Redis数据结构——快速列表
Redis对象——Redis对象系统简介
Redis对象——字符串
Redis对象——哈希(Hash)
Redis对象——列表(List)
Redis对象——集合(Set)
Redis对象——有序集合(ZSet)

 

 

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
posted @ 2021-06-22 16:53  爱寂寞撒的谎言  阅读(51)  评论(0)    收藏  举报