redis介绍:

redis是一种noSQL数据库,它的数据是保存在内存中,同时,redis可以定时把内存中的数据同步到磁盘,即可以将数据持久化,并且它比memcached支持更多的数据结构,string, list, set, sorted_set, hash

redis应用场景:

1. 登陆会话存储,存储在redis中,与memcached相比,数据不会丢失

2. 计数器/排行榜: 这种数据访问的频率很高,且不停的在刷新。

3. 作为消息队列:比如celery就是使用redis作为中间人

4. 当前在线人数,会显示当前系统有多少人在线

5. 一些常用的数据,可以使用redis缓存,而不用每次登陆都要请求数据库

6. 可以将前200篇文章或者评论缓存,一般用户浏览网站,只会浏览前面一部分文章或者评论,所以可以将前面一部分的数据缓存起来,当用户访问超过时,再去请求数据库,并且当文章超过200且有更新时,redis章的数据也跟着更新。

8. 发布和订阅功能,可以用来做聊天软件

redis和memcached的比较:
 

 

memcached

redis

类型

纯内存数据库

内存+磁盘同步

数据类型

在定义val时固定数据类型

不需要

虚拟内存

不支持

支持

过期策略

支持

支持

存储数据安全

不支持

可以将数据同步到dump.db中

灾难恢复

不支持

可以将磁盘中的数据恢复到内存中

分布式

支持

主从同步

订阅与发布

不支持

支持

虚拟内存:操作系统在内存不够用的时候,将硬盘虚拟化为内存。

Redis安装与连接:
redis官方只支持linux系统:

可以尝试安装window下的redis服务,然后我们的主要目标是通过python来操作redis

windows下redis的下载地址:

Github 下载地址:https://github.com/microsoftarchive/redis/releases

这里选择下载msi安装文件,点击安装文件:
 

redisUtil 更新内容过期时间不变 redis刷新过期时间_Redis

点击安装包,开始安装:

redisUtil 更新内容过期时间不变 redis刷新过期时间_redis_02

点击next即可:

redisUtil 更新内容过期时间不变 redis刷新过期时间_数据_03

设置redis的安装目录,以及勾选将redis添加到环境变量,此时会将Redis 设置成 windows 下的服务,否则每次都要在该目录下启动命令 redis-server redis.windows.conf,但是只要一关闭 cmd 窗口,redis 就会消失,这样就比较麻烦。

然后保持redis默认端口不变:

redisUtil 更新内容过期时间不变 redis刷新过期时间_数据_04

关于最大内存设置:

1. 如果是将redis作为数据库使用,那不需要设置这个选项,应为设置了固定的大小,在内存超出这个设定的时候,数据就会丢失

2. 如果是作为缓存,那么可以按需设置redis的最大内存限制,设置了最大内存限制,redis在启动之后会将数据加载到内存中。g当数据超过最大内存限制之后,redis会将过期或者即将过期的数据清除,如果内存依然超过最大限制,则此时redis将不能写入数据,但是可以正常读取数据。

redisUtil 更新内容过期时间不变 redis刷新过期时间_数据_05

这里是最为缓存使用的,所以设置最大的内存限制为500M;安装即可

安装完成后,可以在资源管理器中看到Redis已经在运行了:

redisUtil 更新内容过期时间不变 redis刷新过期时间_数据_06

此时先停止redis服务

设置redis密码(默认是没有密码的):找到下面的两个文件,打开后分别是requirepass的值:

redisUtil 更新内容过期时间不变 redis刷新过期时间_Redis_07

在cmd下,cd到redis安装的根目录:执行redis-server.exe redis.windows.conf

redisUtil 更新内容过期时间不变 redis刷新过期时间_数据_08

此时表示redis安装成功。

在资源管理器中,首先确定已经启动了Redis服务,如果没有启动,先手动启动Redis服务:

然后在命令行中执行命令:redis-cli -a 123456ff,即可连接到redis:

redisUtil 更新内容过期时间不变 redis刷新过期时间_redis_09

redis字符串以及过期时间设置:

redisUtil 更新内容过期时间不变 redis刷新过期时间_Redis_10

常用方法:

1. set key val  设置

2. get key

3. del key

4. set key val EX 10   设置过期时间,默认为永不过期

5. ttl key  查看过期时间

6. expire key time     重新为key设置过期时间

7. keys *    获取redis中所有的键

Redis列表操作:

1. lpush key value    在列表左边添加元素

2. rpush key value     在列表右边添加元素

3. lrange key start stop    查找列表中的元素,start起始位置, stop结束位置     0第一个元素的索引      -1最后一个元素的索引

4. lpop  key   移除并返回列表key的头元素

5. rpop  key   移除并返回列表key的尾元素

6. lindex key index   查看下表为index的元素

7. llen key 返回列表的长度

8. lrem key count val    删除列表中的指定元素

count >0 从表头开始向表尾搜索,移除值为value的元素,移除的数量为count个

count <0 从表尾开始向表头搜索,移除值为value的元素,移除的数量为-count个

count=0  表示删除所有值为value的元素

Redis集合操作:

集合:

1. 数据不能重复

2. 列表中的元素是有序的,而列表中的元素是无序的。

集合的操作:

1. sadd key val1 val2 val3      给集合中添加元素

2. srem key val1 val2             移除集合中的元素

3. scard key                           查看集合中的元素个数

4. sinter key1 key2                 查看两个集合的交集

5. sunion key1 key2               查看两个集合的并集

6. sdiff  key1, key2                查看两个集合的差集

Redis Hash操作:(在python中为字典)

哈希: 字典中的字典:person
{

      "username": "tom",

       "person": {

        "name": "xxx",

        "age":  22

        }

}

1. hset key field value        将hash表key中的域field的值设置为value

hset person name xxx

hmset person name xxx age 22 sahool high-school        一次添加多个键值对

2. hget key  field                获取哈希中field域的值

hget person name

3. hdel key field                删除哈希表中field域

hdel person name

4. hgetall key                    获取hash中的所有键值对

5. hkeys key                      获取哈希中所有的键

6. hvals key                       获取哈希中所有的值

7. hexists key field            判断哈希中是否存在某个键

hexists person name      

8. hlen key   获取哈希中所有的键值对

hlen person

Redis事务操作:

redis事务一次可以执行多个命令,事务具有以下特征:

隔离操作: 事务中的所有命令都会序列化,按顺序的执行,不被其他命令打扰

原子操作:事务中的命令要么全部被执行,要么全部都不执行

开启一个事务:

multi命令开启一个事务, 然后编写一些列的命令

执行事务:

exec命令用于执行事务

取消事务:

discard命令用于取消事务

1. 监视一个或者多个key:   watch key    如果在事务执行之前,这些key被其他的命令所改动,那么事务将被打断

2. 取消所有key的监视     unwatch

Redis发布/订阅操作: 

Redis发布,相当于发送消息,而订阅,相当于监听,监听是否有消息发送过来

发布,首先要指定将消息发布到哪一个频道上去,订阅,也要指定是在监听哪一个频道

subscribe channel   开始监听

publish channen message   发布信息

可以订阅多个频道

实际的应用场景:发送邮件,python代码操作redis发送邮件

RDB和AOF两种数据持久化机制:

在redis.conifg文件中:  数据同步方式

save 900 1                      在900秒内发生1次数据更新,则把数据同步到RDB文件中

save 300 10                    在300秒内发生10次数据更新,则把数据同步到RDB文件中

save 60 10000                在60秒内发生10000次数据更新,则把数据同步到RDB文件中

redis默认的是RDB数据持久化机制

关闭RDB,只需要将config文件中的所有的save注释掉

 

RDB

AOF

开启关闭

默认开启;关闭:将配置文件中所有的save都注释了

在配置文件中,appendonly yes就开启了AOF,no为关闭

同步机制

可以指定某个时间内发生多少次数据更新则进行同步save 300 10

每秒同步或者每次发生数据更新后同步

存储内容

存储的是redis里面的具体值

存储的是redis中执行写操作的命令

存储文件的路径

根据dir以及filename来指定具体的存储路径和文件名

根据dir以及appendfiename来指定具体的路径和文件名

优点

1.存储数据到文件中会进行压缩,文件体积比AOF小。

2. 存储的是redis中数据的具体值,并且经过压缩,所以在恢复的时候比AOF块,非常适用于备份

1. AOF的策略是每秒钟或者每次发生写操作的时候,都会进行数据同步,因此即使服务器发生故障,最多只丢失1秒的数据。

2. AOF存储的是Redis命令,并且是直接追加到aof文件后面,因此每次备份的时候只需添加新的命令进去就可以了。

3. 如果AOF文件比较大了,redis会进行重写,只保留最小的命令集合

缺点

1. RDB在多少时间内发生多少次写操作的时候,就会发出同步机制,因为采用压缩机制,RDB在同步的时候都重新保存整个redis中的数据,因此一般会设置最少5分钟才保存一次数据,在这种情况下,一旦服务器故障,会造成5分钟的数据丢失

2. 载数据保存进RDB的时候,Redis会fork出一个子进程来进行数据同步,在数据量比较大的时候,可能会非常耗时

1. AOF文件没有压缩,所以体积会比RDB文件大。

2. AOF是在每秒或者每次写操作的时候都进行备份,因此如果并发量比较大,效率可能有点慢。

3. AOF文件因为存储的是命令,因此在灾难恢复的时候,会重新运行AOF中的命令,速度不及RDB

 

AOF中数据同步的策略:

appendsync always   只要发生一次数据更新, 就进行同步

appendsync everysec    每秒钟进行一次同步

appendsync no         使用操作系统的同步机制,通常是30s同步一次数据

其他机器连接本机Redis:

如果想让其他机器连接本机的redis,那么应该在redis.config配置文件中,指定bind 本机IP。这样别的机器就能连接成功

python操作Redis:

安装redis:pip install redis-i https://pypi.douban.com/simple/

相当于一个驱动,可以通过这个python包来操作redis

# -*- coding: utf-8 -*-

from redis import Redis

# 初始化redis实例对象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")

# 字符串操作
cache.set(name="username", value="tom", ex=120)    # ex是设定过期时间
username = cache.get(name="username")
print(username)

cache.delete("username")
username = cache.get("username")
print(username)


# 列表操作
cache.rpush("language", "java")
cache.rpush("language", "python")
cache.rpush("language", "C++")
cache.rpush("language", "php")
cache.expire(name="language", time=120)
print(cache.lrange("language", start=0, end=-1))

# 集合操作
cache.sadd("teammate", "zhang")
cache.sadd("teammate", "tom")
cache.sadd("teammate", "kong")
cache.expire(name="teammate", time=120)
print(cache.smembers(name="teammate"))

# hash操作
cache.hset(name="person", key="name", value="took")
cache.hset(name="person", key="age", value="moon")
cache.hset(name="person", key="address", value="street No.1")
cache.expire(name="person", time=120)
print(cache.hgetall(name="person"))

# 事务操作
pipeline = cache.pipeline()
pipeline.set(name="name", value="kitty", ex=100)
pipeline.rpush("candidate", ["coon", "mood", "cooker"])
pipeline.expire(name="candidate", time=120)
pipeline.execute()

发布与订阅:

异步发送邮件,在订阅之后,只需通过频道发送一个消息,订阅方会在收到消息后,自动发送邮件

发送消息:

# -*- coding: utf-8 -*-

from redis import Redis

# 初始化redis实例对象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")

for x in range(3):
    # 发布消息
    cache.publish(channel="email", message="2333scas@163.com")   # 发布的频道,及消息

接收消息:

# -*- coding: utf-8 -*-

from redis import Redis

# 初始化redis实例对象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")


# 发布与订阅   异步发送邮件的功能
ps = cache.pubsub()
ps.subscribe("email")     # 订阅
while True:
    # ps.listen()      # 开始监听
    for item in ps.listen():      # 监听到消息
        # print(item)
        if item.get("type") == "message":
            data = item.get("data")
            print(data)
            # 可以进行发送邮件操作

监听到的消息,item的数据如下所示:

redisUtil 更新内容过期时间不变 redis刷新过期时间_数据_11

如果item中的字段为message,则表示收到发布信息,data字段中为收到的信息。channel为发布的频道。

--------------------------------------------------------------------------------------------------------