python第19次课

python访问redis

首先看个案例
不管是电商网站仍是支付系统,都离不开数据的存储和增删改查,在这种状况下,每一次登陆、访问等都会访问,这样会给数据库形成很大的压力,当数据库没法支撑太高的访问量,轻则影响用户体验,重则致使数据库宕机,网站没法访问。
如何解决数据库压力过大的问题呢?python

  1. 优化应用程序,减小数据库的链接数,尽可能使用数据库链接池。
  2. 使用消息队列,常见的有RabbitMQ,ActiveMQ,Kafka,RocketMQ等。
  3. 经过使用redis等缓存数据,分担数据库读压力,同时直接从内存读数据速度更快。

下面主要针对redis等nosql数据库进行介绍。linux

nosql介绍

特征

对于NoSQL并无一个明确的范围和定义,可是他们都广泛存在下面一些共同特征:redis

  1. 不须要预约义模式:不须要事先定义数据模式,预约义表结构。数据中的每条记录均可能有不一样的属性和格式。当插入数据时,并不须要预先定义它们的模式。
  2. 无共享架构:相对于将全部数据存储的存储区域网络中的全共享架构。NoSQL每每将数据划分后存储在各个本地服务器上。由于从本地磁盘读取数据的性能每每好于经过网络传输读取数据的性能,从而提升了系统的性能。
  3. 弹性可扩展:能够在系统运行的时候,动态增长或者删除结点。不须要停机维护,数据能够自动迁移。
  4. 分区:相对于将数据存放于同一个节点,NoSQL数据库须要将数据进行分区,将记录分散在多个节点上面。而且一般分区的同时还要作复制。这样既提升了并行性能,又能保证没有单点失效的问题。
  5. 异步复制:和RAID存储系统不一样的是,NoSQL中的复制,每每是基于日志的异步复制。这样,数据就能够尽快地写入一个节点,而不会被网络传输引发迟延。缺点是并不老是能保证一致性,这样的方式在出现故障的时候,可能会丢失少许的数据。
  6. BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
    NoSQL数据库并无一个统一的架构,两种NoSQL数据库之间的不一样,甚至远远超过两种关系型数据库的不一样。能够说,NoSQL各有所长,成功的NoSQL必然特别适用于某些场合或者某些应用,在这些场合中会远远赛过关系型数据库和其余的NoSQL

    经常使用的nosql数据库

    临时性键值存储|永久性键值存储|面向文档的数据库|面向列的数据库
    -|:-:|:-:|:-:|
    Memcached|Tokyo Tyrant|MangoDB|Cassandra
    Redis|Flare|CouchDB|HBase
     |ROMA||HyperTable
     |Redis||

    redis安装和配置

    安装

    redis主要用于linux下,下面centos7下面安装最新版本redis-4.0.9。
    1
    2
    3
    4
    5
    wget http://download.redis.io/releases/redis-4.0.9.tar.gz
    tar xzf redis-4.0.9.tar.gz
    cd redis-4.0.9/
    make
    cd src && make all

安装过程当中报错说明sql

  • 未安装gcc编译工具
    redis基于C语言编写,须要使用gcc等编译工具,若未安装,在make编译过程当中会报错。使用yum install gcc安装,默认会安装gcc及对应的依赖包便可。
  • 未安装jemalloc
    默认状况下redis的memory allocatorjemalloc,若未安装会出现下面报错信息
    1
    2
    3
    4
    5
    6
    7
    zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
     #include <jemalloc/jemalloc.h>
                                   ^
    compilation terminated.
    make[1]: *** [adlist.o] Error 1
    make[1]: Leaving directory `/usr/local/src/redis-4.0.9/src'
    make: *** [all] Error 2

能够设置使用libc malloc,编译的时候使用make MALLOC=libc便可。
具体更多内容能够参见redis解压目录下的redis.MD文件中Allocator部分。mongodb

配置

redis能够单机多实例,经过修改配置文件,不一样实例使用不一样的配置文件和端口号便可。
下面配置文件统一存放在conf目录中。数据库

1
2
3
4
5
cd /usr/local/src/   
mv redis-4.0.9 redis    #目录重命名,取消版本信息
cd redis
mkdir conf     #新建配置文件目录,统一存放配置文件
cp redis.conf conf/redis_6379.conf    #配置文件,以端口号命名

 

修改redis_6379.conf文件,默认该配置项为no,修改成yes。
该参数表示是否使用守护线程的方式启动。
当设置为yes时,表示开启守护进程模式。该模式下,redis在后台运行,并将进程pid写入至配置文件中设置的pidfile中,此时redis将一直运行,除非手动kill该进程。
当设置为no时,当前界面将进入redis的命令行界面,ctrl+c强制退出或者关闭链接工具都会致使redis进程退出。centos

1
daemonize yes

 

启动缓存

1
redis-server /usr/local/src/redis/conf/redis_6379.conf

 

确认是否启动
经过进程确认安全

1
2
3
[root@VM_0_4_centos conf]# ps aux|grep redis
root     25841  0.0  0.1 141772  1976 ?        Ssl  23:26   0:00 redis-server 127.0.0.1:6379
root     25856  0.0  0.0 112644   964 pts/1    R+   23:26   0:00 grep --color=auto redis

 

经过端口号确认服务器

1
2
[root@VM_0_4_centos conf]# netstat -lntp |grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      25841/redis-server

 

redis数据类型

redis支持5种数据类型,分别是String(字符串)、List(列表)、Hash(字典)、Set(集合)、Sorted Set(有序集合)。
本质上来讲,redis存储的是key-value对,其中key是字符串,对应的value类型决定了redis的数据类型。

  • String(字符串)
    string是redis最基本的类型,其基本模型也是一个key对应一个value。
    string类型是二进制安全的。也就是说redis的string能够包含任何数据。好比jpg图片或者序列化的对象 。
    string类型是Redis最基本的数据类型,一个键最大能存储512MB。

    1
    2
    3
    4
    127.0.0.1:6379> SET name "xiaohh"
    OK
    127.0.0.1:6379> GET name
    "xiaohh"
  • List(列表)
    Redis 列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素到列表的头部(左边)或者尾部(右边)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    127.0.0.1:6379> lpush xiaohh redis
    (integer) 1
    127.0.0.1:6379> lpush xiaohh mongodb
    (integer) 2
    127.0.0.1:6379> lpush xiaohh rabitmq
    (integer) 3
    127.0.0.1:6379> lrange xiaohh 0 2
    1) "rabitmq"
    2) "mongodb"
    3) "redis"
  • Hash(字典)
    Redis hash 是一个键值(key=>value)对集合。
    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> HMSET myhash fileld1 "Hello" fileld2 "World"
    OK
    127.0.0.1:6379> HGET myhash fileld1
    "Hello"
    127.0.0.1:6379> HGET myhash fileld2
    "World"
  • Set(集合)
    Redis的Set是string类型的无序集合。
    集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是O(1)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    27.0.0.1:6379> sadd type redis
    (integer) 1
    127.0.0.1:6379> sadd type mongodb
    (integer) 1
    127.0.0.1:6379> sadd type rabbitmq
    (integer) 1
    127.0.0.1:6379> sadd type rabbitmq
    (integer) 0
    127.0.0.1:6379> smembers type
    1) "rabbitmq"
    2) "mongodb"
    3) "redis"

因为Set中元素具备惟一性的,因此重复添加的rabbitmq只有一个,第二次添加将被忽略。

  • Sorted Set(有序集合)
    Redis zset 和 set 同样也是string类型元素的集合,且不容许重复的成员。
    不一样的是每一个元素都会关联一个double类型的分数。redis正是经过分数来为集合中的成员进行从小到大的排序。
    zset的成员是惟一的,但分数(score)却能够重复。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    127.0.0.1:6379> zadd  type1 0 redis
    (integer) 1
    127.0.0.1:6379> zadd type1 3 mongodb
    (integer) 1
    127.0.0.1:6379> zadd type1 2 rabbitmq
    (integer) 1
    127.0.0.1:6379> zadd type1 2 rabbitmq
    (integer) 0
    127.0.0.1:6379> ZRANGEBYSCORE type1 0 10
    1) "redis"
    2) "rabbitmq"
    3) "mongodb"

python访问redis

python访问redis须要安装对应的redis包。

1
pip install redis

 

redis链接池
redis-py使用connection pool来管理对一个redis server的全部链接,避免每次创建、释放链接的开销。
默认,每一个Redis实例都会维护一个本身的链接。能够直接创建一个链接池,而后做为Redis参数,这样就能够实现多个Redis实例共享一个链接池。
链接redis服务器
链接redis服务器须要提供redis服务器的地址和端口号,默认端口号为6379。

1
2
3
4
5
6
import redis

pool = redis.ConnectionPool(host="118.24.18.158", port="6379")
r = redis.Redis(connection_pool=pool)
r.set("name", "xiaohh")
print(r.get("name"))    #输出结果:"xiaohh"

 

经过python对redis数据库进行操做,首先创建redis的链接,而后对不一样的数据类型采用不一样的方法进行操做。
具体操做方法下次介绍。
更多redis相关内容能够点击查看官方文档

相关文章
相关标签/搜索