首先看个案例
不管是电商网站仍是支付系统,都离不开数据的存储和增删改查,在这种状况下,每一次登陆、访问等都会访问,这样会给数据库形成很大的压力,当数据库没法支撑太高的访问量,轻则影响用户体验,重则致使数据库宕机,网站没法访问。
如何解决数据库压力过大的问题呢?python
下面主要针对redis等nosql数据库进行介绍。linux
对于NoSQL并无一个明确的范围和定义,可是他们都广泛存在下面一些共同特征:redis
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
make
编译过程当中会报错。使用yum install gcc
安装,默认会安装gcc及对应的依赖包便可。jemalloc
memory allocator
是jemalloc
,若未安装会出现下面报错信息
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支持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
只有一个,第二次添加将被忽略。
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须要安装对应的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相关内容能够点击查看官方文档。