python 基础 10.0 nosql 简介--redis 连接池及管道

一. NOSQL 数据库简介

NoSQL 泛指非关系型的数据库。非关系型数据库与关系型数据库的差别

非关系型数据库的优势:

1.性能NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL 层的解析,所以性能非常高。

2.可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

1. 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。

2.事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势。反之亦然。但是近年来这两种数据库都在向着另外一个方向进化。例如:NOSQL 数据库慢慢开始具备SQL 数据库的一些复杂查询功能的雏形,比如 Couchbase 的index 以及 MONGO 的复杂查询。对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国。SQL 数据库也开始慢慢进化,比如 HandlerSocker 技术的实现,可以在MYSQL上实现对于SQL 层的穿透,用NOSQL 的方式访问数据库,性能可以上达到甚至超越NOSQL 数据库。可扩展性上例如Percona Server ,可以实现无中心化的集群。虽然这两级都因为各自的弱势而开始进化出另一极的一些特征性,但是这些特性的增加也会消弱其本来具备的优势,比如Couchbase上的index 的增加会逐步降低数据库的读写性能。所以构建系统的短期和长期存储策略,用好他们各自的强项是架构师需要好好考虑的重要问题。

二. python 操作 redis

redis 的概念:

redis 是一个key-value 存储系统。和Memcached 类似,它支持存储的value类型相对更多,包括string ,list,set(集合),zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持 push/pop add/remove 及取交际并集和差集更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value 数据库。redis 的出现,很大程度补偿了memcached 这类 key/value 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。

Readis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis 可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

三. Redis 的搭建

见本博客地址: http://www.cnblogs.com/lzcys8868/p/7532873.html

或如下进行简易安装redis

#cd /usr/local/src

#wget http://download.redis.io/releases/redis-3.0.1.tar.gz

#tar xzf redis-3.0.1.tar.gz

#cd redis-3.0.1

#make

#更改redis.conf 把 daemonize no 更改为 daemonize yes 。可以后台启动

#src/redis-server & 或 src/redis-server + redis.conf 配置文件路径

检查redis是否正常启动

Ps –ef |grep redis

Netstat –lnp |grep 6379

四 linux 上 redis 客户端安装

pip install redis

五. redis 的简单操作

#/usr/bin/python

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

#@Time :2017/11/26 21:06

#@Auther :liuzhenchuan

#@File :redis 安装.py

#pycharm 安装redis 只需导入redis模块

import redis

##一. redis 简单操作

#方法一,连接redis。及插入数据

redis_config = {

‘host‘:‘192.168.16.70‘,

‘port‘:6379

}

r = redis.Redis(**redis_config)

#set 操作 第一个参数就是key 第二个参数就是value

r.set(‘liu‘,‘you are very good‘)

# r.keys 就是获取到所有的keys

print (r.keys())

# r.get 就是获取到key的值

print r.get(‘liu‘)

# 连接redis ,方法二

r = redis.Redis(host=‘192.168.16.70‘,port=6379)

##二. redis 连接池

print ‘##‘*5 + ‘redis 连接池‘ + ‘##‘*5

def get_redis_connect():

redis_config = {

‘host‘: ‘192.168.16.70‘,

‘port‘: 6379

}

pool = redis.ConnectionPool(**redis_config)

r = redis.Redis(connection_pool=pool)

return r

if __name__ == ‘__main__‘:

r = get_redis_connect()

r.set(‘name‘,‘lzc‘)

r.set(‘age‘,‘18‘)

print r.get(‘name‘)

print r.get(‘age‘)

print r.keys()

>>>

##########redis 连接池##########

lzc

18

[‘name‘, ‘liu‘, ‘age‘]

六. redis 的管道

##可以一次执行多次redis 命令

管道:

redis-py 默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline 实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。减少功耗redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常会阻塞

并等待redis 服务处理,redis 处理完成后请求命令后会将结果通过相应报文返回给client。

七. 应用管道与不应用管道的时间差为10倍

#/usr/bin/python

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

#@Time :2017/11/26 23:39

#@Auther :liuzhenchuan

#@File :redis 管道.py

import datetime

import redis

def withpipe(r):

pipe = r.pipeline(transaction=True)

for i in xrange(1, 1000):

key = "test1" + str(i)

value = "test1" + str(i)

pipe.set(key, value)

pipe.execute()

def withoutpipe(r):

# pipe = r.pipeline(transaction=True)

for i in xrange(1, 1000):

key = "test1" + str(i)

value = "test1" + str(i)

r.set(key, value)

if __name__ == "__main__":

pool = redis.ConnectionPool(host="192.168.16.70", port=6379, db=0)

r1 = redis.Redis(connection_pool=pool)

r2 = redis.Redis(connection_pool=pool)

start = datetime.datetime.now()

print(start)

withpipe(r1)

end = datetime.datetime.now()

# print((end-start).microseconds)

print(end-start)

t_time = (end - start).microseconds

print("withpipe time is : {0}".format(t_time))

start = datetime.datetime.now()

withoutpipe(r2)

end = datetime.datetime.now()

t_time = (end - start).microseconds

print("withoutpipe time is : {0}".format(t_time))

>>>

2017-11-26 23:49:58.260000

0:00:00.063000

withpipe time is : 63000

withoutpipe time is : 489000

时间: 2024-10-10 15:44:54

python 基础 10.0 nosql 简介--redis 连接池及管道的相关文章

day24——NoSQL简介、redis服务搭建、redis连接池、redis管道

一.Redis 安装 yum install -y epel-releaseyum install -y gcc jemalloc-devel wgetcd /usr/local/srcwget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 -O redis-2.8.21.tar.gztar xf redis-2.8.21.tar.gzcd redis-2.8.21makemake PREFIX=/usr/local/redis

SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Loging能诊断Hack应用行为.Druid连接池是阿里巴巴内部唯一使用的连接池,在内部数据库相关中间件TDDL/DRDS 都内置使用强依赖了Druid连接池,经过阿里内部数千上万的系统大规模验证,经过历年双十一超大规模并发验证. 2.druid特点 1)稳定性特性,阿里巴巴的业务验证 2)完备的监控信息,

redis连接池 jedis-2.9.0.jar+commons-pool2-2.4.2.jar

java使用Redis连接池  jar包为 jedis-2.9.0.jar+commons-pool2-2.4.2.jar 1 package com.test; 2 3 import redis.clients.jedis.Jedis; 4 import redis.clients.jedis.JedisPool; 5 import redis.clients.jedis.JedisPoolConfig; 6 7 public class RedisUtil { 8 //Redis服务器IP

Go语言之从0到1实现一个简单的Redis连接池

Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识,以及Redis Protocol文档,就想着自己造个轮子练练手. 这次我把目标放在了Redis client implemented with Go,使用原生Go语言和TCP实现一个简单的Redis连接池和协议解析,以此来让自己入门Go语言,并加深理解和记忆.(这样做直接导致的后果是,最近写JS时

python 里的 redis 连接池的原理

python设置redis连接池的好处: 通常情况下,需要连接redis时,会创建一个连接,基于这个连接进行redis操作,操作完成后去释放,正常情况下,这是没有问题的,但是并发量较高的情况下,频繁的连接创建和释放对性能会有较高的影响,于是连接池发挥作用. 连接池的原理:‘预先创建多个连接,当进行redis操作时,直接获取已经创建好的连接进行操作.完成后,不会释放这个连接,而是让其返回连接池,用于后续redis操作!这样避免连续创建和释放,从而提高了性能! import redis pool =

python基础10

python基础10 昨日回顾: def 函数名(): 函数体 return 返回值 所有的函数  只定义不调用就一定不执行 先定义后调用 函数名()  #不接收返回值 返回值 = 函数名()  #接收返回值 #返回值 #没有返回值:默认返回None #不写return :函数内的代码执行完毕自动结束 #只写return :结束一个函数 #return None #返回一个值:结束了函数且返回一个值,可以是任意的值 #返回多个值:多个值之间用逗号隔开,接收的时候可以用一个变量接受(元祖),也可以

redis 连接池 - 转载

所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar Jedis操作步骤如下:1->获取Jedis实例需要从JedisPool中获取:2->用完Jedis实例需要返还给JedisPool:3->如果Jedis在使用过程中出错,则也需要还给JedisPool: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; imp

java中使用jedis操作redis(连接池方式)

1 package com.test; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.Map; 7 8 import org.junit.Before; 9 import org.junit.Test; 10 11 import redis.clients.jedis.Jedis; 12 13 public class TestRedis

三:Redis连接池、JedisPool详解、Redisi分布式

单机模式: 1 package com.ljq.utils; 2 3 import redis.clients.jedis.Jedis; 4 import redis.clients.jedis.JedisPool; 5 import redis.clients.jedis.JedisPoolConfig; 6 7 /** 8 * Redis操作接口 9 * 10 * @author NiceCui 11 * @version 1.0 2017-6-14 上午08:54:14 12 */ 13