redis

redis

Redis (remote dictionary server )是⼀种基于键值对的NoSQL数据库,它提供了对多种数据类型(字符串、哈希、列表、集合、有序集合、位图等)的⽀持,能够满⾜很多应 ⽤场景的需求。Redis将数据放在内存中,因此读写性能是⾮常惊⼈的。与此同时,Redis也提供了持久化机制,能够将内存中的数据保存到硬盘上,在发⽣意外状况时数据也不会丢掉。此外,Redis还⽀持键过期、地理信息运算、发布订阅、事务、管道、Lua脚本扩展等功能,总⽽⾔之,Redis的功能和性能都⾮常强⼤,如果项⽬中要实现⾼速缓存和消息队列这样的服务,直接交给Redis就可以了。

redis官方文档redisdoc.com

redis优点

  • Redis的读写性能极⾼,并且有丰富的特性(发布/订阅、事务、通知等)。

  • Redis⽀持数据的持久化(RDB和AOF两种⽅式),可以将内存中的数据保存在磁盘中,᯿启的时候可以再次加载进⾏使⽤。

  • Redis⽀持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。

  • Redis⽀持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并⾃动调整配置)。

  • Redis⽀持分布式集群,可以很容易的通过⽔平扩展来提升系统的整体 性能。

  • Redis基于TCP提供的可靠传输服务进⾏通信,很多编程语⾔都提供了Redis客户端⽀持。

redis应用场景

  • ⾼速缓存 - 将不常变化但⼜经常被访问的热点数据放到Redis数据库中,可以⼤⼤降低关系型数据库的压⼒,从⽽提升系统的响应性能。

  • 排⾏榜 - 很多⽹站都有排⾏榜功能,利⽤Redis中的列表和有序集合可以⾮常⽅便的构造各种排⾏榜系统。

  • 商品秒杀/投票点赞 - Redis提供了对计数操作的⽀持,⽹站上常⻅的秒杀、点赞等功能都可以利⽤Redis的计数器通过+1或-1的操作来实现,从⽽避免了使⽤关系型数据的 update 操作。

  • 分布式锁 - 利⽤Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,⽤于实现⼀个阻塞式操作。

  • 消息队列 - 消息队列和⾼速缓存⼀样,是⼀个⼤型⽹站不可缺少的基础服务,可以实现业务解耦和⾮实时业务削峰等特性,这些我们都会在后⾯的项⽬中为⼤家展示。

redis下载安装启动

  1. wget http://download.redis.io/releases/redis-5.0.5.tar.gz下载redis包

  2. tar -xzf redis-5.0.5.tar解压redis包

  3. sudo apt install build-essential -y安装电脑里所有软件的依赖包

  4. 在redis解压的包里有Makefile就可以直接运行make命令进行编译,然后make install

    有些编译软件包没有Make文件,就运行它的配置文件,就会生成一个make文件,然后就可以make进行编译

5.在redis解压包里更改redis.conf配置里的内容

daemonize yes
263行 dir /var/local/redis/ -- 固定dbfilename dump.rdb的位置,(首先在/var/local/下创建redis文件夹)

6.启动服务

将redis.conf复制到/usr/local/etc下

sudo cp redis.conf /usr/local/etc

系统配置放在/etc/下,用户自己的配置文件放在/usr/local/etc/下

redis-server /usr/local/etc/redis.conf

查看redis是否启动

ps aux|grep redis

  

7.连接redis

redis-cli

也可以指定地址和端口号:redis-cli [-h 'xxxx' -p 'xxxx']

redis-cli --raw其中--raw表示对于可能乱码进行自动转码

redis数据类型

string: 字符串类型

- 主要用在普通缓存
   - set(key,value,expire)
   - get(key)
   - mset({k1:v1,k2:v2,...}) # 一次设置多个key
   - mget([k1,k2,k3,...]) # 一次取多个key
   - incr(key) / incrby(key)  # 自增
   - decr(key) / decrby(key)   # 自减
   - ttl(key) # 查看过期时间
   - keys('*') # 可以使用通配符进行查找
   - setnx(key,value) #如果key不存在,则设置,如果存在什么也不做,常用来做分布式锁

hash: 哈希类型

  • 底层使用哈希表实现

    • 主要用在缓存和对象存储

      • hset(name,key,value)

      • hget(name,key)

      • hgetall(name)

      • hmset(name,{k1:v1,k2:v2,...})

      • hmget(name,[k1,k2,k3,...])

      • hincrby(name,key,amount=1)

list: 列表类型(主要用在消息队列中)

  • 底层使用双端链表

    • 主要用来构造 “队列” 或者 “栈”

      • lpush / rpush(name,*values)

      • lpop / rpop(name)

      • blpop / brpop(name,timeout=0)

      • llen

      • lrange(name,start,end) 双闭区间,取出list中从start到end之间的元素

      • ltrim(name,start,end) 将列表截取为List中从start到end之间的元素,原来的list就会少了这些截取的元素

      • lset

      • lrem 从指定位置删 lrem(name,count,value) count大于0,从左边删,小于0从右边删,等于0全删

    brpop 功能: 从右到左扫描 key1 ... keyN,对第一个非空 List 进行 rpop 操作并返回该值。如果所有 List 都是空或不存在,阻塞 timeout 秒,timeout0 表示一直阻塞。阻塞时,如果有其他 clientkey1 ... keyN 中任意一个 key 进行 push 操作时,阻塞接触并返回。如果超时,则返回 nil

    其实就是相当于对多个队列(按照从尾队列 keyN 到头队列 key1)进行 rpop

    使用 redis.rpop不会阻塞,这样一直在死循环的找任务,占用cpu,造成不必要的浪费,使用 redis.brpop在没有任务的时候阻塞,设置timeout=0,即是有list中有任务来到的时候就会自动将任务pop出去,由consumer消费掉

  • python 对list的一些常规操作

  •  

     

     

set: 集合类型

  • 底层使用哈希表实现

    • 主要用在数据去重和集合运算 (比如爬虫的分布式去重)

      • sadd

      • sinter # 交集

      • sunion # 并集

      • sdiff # 差集

      • sismember('ss',value) # 检查是否是集合中的某一个成员

      • smembers('ss') # 列举集合中的所有的成员

      • spop('ss') # 从集合中随机弹出一个元素

 

 

zset: 有序集合类型(常用在排行榜,以及带优先级的队列中)

  • 底层使用跳表实现

    • 主要用在数据排序,或排行榜的实现,以及带优先级的队列中

      • zadd(name,{k1:v1,k2:v2,...})

      • zrange(name,0,-1,withsores=True) # 带分数排序输出

      • zrevrange(name,0,-1,withsores=True) # 反转排序输出

      • zincrby(name,10,key)

 

 

在game中添加一个成员,直接使用zincrby

 

 

Pub/Sub(发布/订阅模式) (可用于聊天室)

  • publish(channel,msg) # 向channel发布一条消息

  • p=pubsub() # 创建一个pubsub对象

  • p.subscribe(channel) # 订阅一个频道

  • p.listen() # 开始监听频道内容,listen()的结果是一个迭代器,可以无限循环,(循环出来的结果是一个字典)

 

 

BitMap(位图)

用于去重最快,时间复杂度是O(N)

redis持久化

  • 1.RDB

    • 将内存中的数据直接生成一个镜像,保存到硬盘上

    • 优点:快

    • 缺点:两次保存的间隔内的数据有可能丢失

    • 保存间隔:

      • 15分钟内有1个key发生修改

      • 5分钟内有10个key发生修改

      • 1分钟内有10000个key发生修改

  • 2.AOF:

    • 记录每次对Redis的增、删、改操作,以追加的方式进行记录

    • 优点:不会丢失数据

    • 缺点:最终的AOF文件会比较大

    • Redis在进行主从复制时,从机会来读取主机的AOF文件,将操作同步到自己的DB上

Python程序中使⽤Redis

可以使⽤pip安装redis模块。redis模块的核⼼是名为Redis的类,该类的对象代表⼀个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执⾏的结果。上⾯我们在Redis客户端中使⽤的命令基本上就是Redis对 象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。

import redis
client = redis.Redis(host='1.2.3.4',port=6379,password='1qaz2wsx')
client.set('username', 'admin')
client.hset('student', 'name', 'hao') 1
client.hset('student', 'age', 38) 1
client.keys('*') [b'username', b'student']
client.get('username')
b'admin'
client.hgetall('student')
{b'name': b'hao', b'age': b'38'}

 

redis哨兵机制,参考网址:https://www.jianshu.com/p/06ab9daf921d

 

posted @ 2020-06-17 14:08  JustInTime  阅读(190)  评论(0)    收藏  举报