redis

课程:redis

知识点一:redis概述

Redis本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务等等。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Memcached 分布式缓存
Redis有哪些适合的场景?
(1)、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?  user:haoyi   password:qwe123

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)、全页缓存(FPC)
动态页面静态化   我们会把今天访问的页面但修改的很少的页面放到redis当中
除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

(3)、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker.

(4),排行榜/计数器

(5)、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

知识点二:redis存储

redis操作

16个数据库 0到15
redis-cli
6379默认监听端口
 --raw  输出中文
进入redis
redis-cli
select 0-15 自由选择

知识点三:redis数据类型

1、string

# string
set name haoyi
get name 
keys *set 
如何删除所有的数据
追加类容
append name1 jack2   # 会自动创建
get name# 'haoyi'
append name jack  # 
get name    "haoyijack"
del name   删除
设置多个 mset name1 jack1 name2 jack2
查看多个 mget name1 name2

自加:incr 
自减:decr 
加: incrby 
减: decrby 

type name1  # string
str_name1  (见名知意)
exists name1  # 查看多少个key
rename name1 name2  # 改名字

2、过期时间

expire name2 10   销毁   10秒之后  /iks bai er/
persist name2  # 删除过期时间   /pə'sɪst/ 
ttl  返回 -1 代表没有过期时间
ttl  返回 -2 已经过期了

创建键的时候就设置过期时间
set name3 jack3 ex 5

3、list


list
# 创建一个键
rpush lname y1 y2 y3 y4 y5 y6 y7
type lname
# 查看
lrange lname 0 -1
左插入
lpush lname g5 g6
右插入
rpush lname g7 g8
索引查找: lindex lname 3
# 修改
lset lname 2 y10

# 删除
rpop lname  # 删除最后面的
lpop lname  # 删除最前面的

lrem mylist 0 "value"    //从mylist中删除全部等值value的元素   0为全部,负值为从尾部开始 1 正向删除
																			
ltrim mylist 1 -1     //保留mylist中 1到末尾的值,即删除第一个值

命令里没有根据index删除元素的命令,如果想要删除指定index的值:

4、Hash

添加数据: hset hname name1 jack1
keys *
hget hname name1
hset hnmae name2 jack2
hget hname name2
	field 存在,正常读取 field 对应的值。
	field 不存在,返回 nil
hmset
	field 不存在,直接存储。
	field 存在,执行覆盖操作
	hmset name1 haoyi1 1 haoyi2 2 haoyi3 3
hmget 
	hmget name1 haoyi1 haoyi2 haoyi3
hdel 删除域
	该命令可以同时删除多个字段,返回值是被删除字段的数量。
	field 存在,删除字段,返回被删除字段的数量。
	field 不存在, 返回0
hgetall hname 域值对  #   读取全部 
hvals hname  # 获取指定 key 所有字段的值
hlen hname   # 多少个域值对

# 增量(hincrby)  实现加法
hset  name10 age 23
hincrby name10 age 3  # 26
 
type key  #查看类型

5、set

# set类型
添加数据: sadd sname g1 g2 g3 g1
查看: smembers sname
spop sname  # 随机
spop sname 2  # 数据删两个
srem sname member g1  # 指定删除 可指定多个

scard sname  # 获取有多少个元素

smove key1 key2 member #将key1中的member移动到key2中

sismember key1 member #判断key1中是否有menber,  有返回1 无返回0

sinter set1 set2 #交集
sinterstore newset set1 set2 #将set1和set2的交集存放到newset中
sunion set 1 set2 #并集
sunionstore newset set1 set2 #将set1和set2中并集存放到newset中
sdiffset1 set1 set2 #差集
sdiffstore newset set1 set2 #将set1与set2的差集存放到newset中

srandmember set #从集合中随机选择一个

6、zset

添加数据:
zadd zname 10 y2 20 y3 30 y4 40 y5
查看数据:
zrange zname 0 -1
zrangebyscore zname 0 100   分数
zrangebyscore zname 0 20
zscore zname y3  # 查看分数   /s guo er/
zcard zname   # 查找多少个元素
删除数据:
zrem zname y1

zremrangebyrank zname 0 2  # 索引删除
zremrangebyscore zname 0 20  # 分数删除



posted @ 2023-08-31 21:36  csh逐梦  阅读(4)  评论(0编辑  收藏  举报