缓存数据库之redis
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题
NoSQL数据库的四大分类
| 分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
| 列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
| 文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
| 图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
redis是业界主流的key-value nosql 数据库之一。 键的类型是字符串且不能重复,值的类型可以分为五种字符串、哈希、列表、集合、有序集合。
安装Redis环境
$sudo apt-get update
$sudo apt-get install redis-server
启动 Redis
$redis-server
查看 redis 是否还在运行
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> ping
PONG
import redis r = redis.Redis(host='10.211.55.4', port=6379)
r.set('foo', 'Bar')
print r.get('foo')
连接池,redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
import redis pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'xmen') #添加
print (r.get('name')) #获取
管道,redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
import redis
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool) pipe = r.pipeline(transaction=True) r.set('name', 'zhangsan')
r.set('name', 'lisi') pipe.execute()
发布和订阅
首先定义一个RedisHelper类,连接Redis,定义频道为monitor,定义发布(publish)及订阅(subscribe)方法
import redis class RedisHelper(object):
def __init__(self):
self.__conn = redis.Redis(host='192.168.0.110',port=6379)#连接Redis
self.channel = 'monitor' #定义名称 def publish(self,msg):#定义发布方法
self.__conn.publish(self.channel,msg)
return True def subscribe(self):#定义订阅方法
pub = self.__conn.pubsub()
pub.subscribe(self.channel)
pub.parse_response()
return pub
发布者
from RedisHelper import RedisHelper obj = RedisHelper()
obj.publish('hello')#发布
订阅者
from RedisHelper import RedisHelper obj = RedisHelper()
redis_sub = obj.subscribe()#调用订阅方法 while True:
msg= redis_sub.parse_response()
print (msg)
基本操作
String操作 表现形式k1—>v1
set(name, value, ex=None, px=None, nx=False, xx=False)
setnx(name, value)
setex(name, value, time)#设置过期时间
psetex(name, time_ms, value)
mset(*args, **kwargs)#设置多个键值
get(name)#获取值
mget(keys, *args)#批量获取
getset(name, value)#设置新值并获取原来的值
getrange(key, start, end)# 获取子序列(根据字节获取,非字符)
setrange(name, offset, value)# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
setbit(name, offset, value)# 对name对应值的二进制表示的位进行操作
getbit(name, offset)# 获取name对应的值的二进制表示中的某位的值 (0或1)
bitcount(key, start=None, end=None)# 获取name对应的值的二进制表示中 1 的个数
strlen(name)# 返回name对应值的字节长度(一个汉字3个字节)
incr(self, name, amount=1)# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
incrbyfloat(self, name, amount=1.0)# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
decr(self, name, amount=1)# 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
append(key, value)# 在redis name对应的值后面追加内容
Hash操作,表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据 。k1——>{Kx—>Vx}
hset(name, key, value)# name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
hmset(name, mapping)# 在name对应的hash中批量设置键值对
hget(name,key)# 在name对应的hash中获取根据key获取value
hmget(name, keys, *args)# 在name对应的hash中获取多个key的值
hgetall(name)#获取name对应hash的所有键值
hlen(name)# 获取name对应的hash中键值对的个数
hkeys(name)# 获取name对应的hash中所有的key的值
hvals(name)# 获取name对应的hash中所有的value的值
hexists(name, key)# 检查name对应的hash是否存在当前传入的key
hdel(name,*keys)# 将name对应的hash中指定key的键值对删除
hincrby(name, key, amount=1)# 自增name对应的hash中的指定key的值,不存在则创建key=amount
hincrbyfloat(name, key, amount=1.0)# 自增name对应的hash中的指定key的值,不存在则创建key=amount
hscan_iter(name, match=None, count=None)# 利用yield封装hscan创建生成器,实现分批去redis中获取数据
List操作,redis中的List在在内存中按照一个name对应一个List来存储
lpush(name,values)# 在name对应的list中添加元素,每个新的元素都添加到列表的最左边
lpushx(name,value)# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
llen(name)# name对应的list元素的个数
linsert(name, where, refvalue, value))# 在name对应的列表的某一个值前或后插入一个新值
lset(name, index, value)# 对name对应的list中的某一个索引位置重新赋值
lrem(name, value, num)# 在name对应的list中删除指定的值
lpop(name)# 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
lindex(name, index)#在name对应的列表中根据索引获取列表元素
lrange(name, start, end)# 在name对应的列表分片获取数据
ltrim(name, start, end)# 在name对应的列表中移除没有在start-end索引之间的值
rpoplpush(src, dst)# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
blpop(keys, timeout)# 将多个列表排列,按照从左到右去pop对应列表的元素
brpoplpush(src, dst, timeout=0)# 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
Set操作,Set集合就是不允许重复的列表
sadd(name,values)# name对应的集合中添加元素
scard(name)获取name对应的集合中元素个数
sdiff(keys, *args)在第一个name对应的集合中且不在其他name对应的集合的元素集合
sdiffstore(dest, keys, *args)# 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
sinter(keys, *args)# 该集合是所有给定集合的交集
sinterstore(dest, keys, *args)# 获取多一个name对应集合的并集,再讲其加入到dest对应的集合中
sismember(name, value)# 检查value是否是name对应的集合的成员
smembers(name)# 获取name对应的集合的所有成员
smove(src, dst, value)# 将某个成员从一个集合中移动到另外一个集合
spop(name)# 从集合的右侧(尾部)移除一个成员,并将其返回
srandmember(name, numbers)# 从name对应的集合中随机获取 numbers 个元素
srem(name, values)# 在name对应的集合中删除某些值
sunion(keys, *args)# 获取多一个name对应的集合的并集
sunionstore(dest,keys, *args)# 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中
sscan(name, cursor=0, match=None, count=None)
sscan_iter(name, match=None, count=None)# 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大
有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。
zadd(name, *args, **kwargs)# 在name对应的有序集合中添加元素
zcard(name)# 获取name对应的有序集合元素的数量
zcount(name, min, max)# 获取name对应的有序集合中分数 在 [min,max] 之间的个数
zincrby(name, value, amount)# 自增name对应的有序集合的 name 对应的分数
zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)# 按照索引范围获取name对应的有序集合的元素
zrank(name, value)# 获取某个值在 name对应的有序集合中的排行(从 0 开始)
zrem(name, values)# 删除name对应的有序集合中值是values的成员
zremrangebyrank(name, min, max)# 根据排行范围删除
zremrangebyscore(name, min, max)# 根据分数范围删除
zscore(name, value)# 获取name对应有序集合中 value 对应的分数
zinterstore(dest, keys, aggregate=None)# 获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作,aggregate的值为: SUM MIN MAX
zunionstore(dest, keys, aggregate=None)# 获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作
其他常用操作
delete(*names)# 根据删除redis中的任意数据类型
exists(name)# 检测redis的name是否存在
keys(pattern='*')# 根据模型获取redis的name
expire(name ,time)# 为某个redis的某个name设置超时时间
rename(src, dst)# 对redis的name重命名为
move(name, db))# 将redis的某个值移动到指定的db下
randomkey()# 随机获取一个redis的name(不删除)
type(name)# 获取name对应值的类型
scan(cursor=0, match=None, count=None)# 同字符串操作,用于增量迭代获取key
scan_iter(match=None, count=None)
缓存数据库之redis的更多相关文章
- 缓存数据库redis
什么是Redis? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命 ...
- 快速搭建Redis缓存数据库
之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...
- 缓存数据库-redis数据类型和操作(list)
转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...
- NOSQL中的redis缓存数据库
NOSQL概述 什么是NOSQL? NoSql(NoSQL=Not Only SQL),意思为"不仅仅是SQL",是一个全新的数据库理念,泛指非关系型的数据库. 为什么需要NOSQ ...
- redis缓存数据库入门教程
入门redis教程 前言: 应公司需求,最近学习了一下redis数据库的一些简单入门的教程,整理出来分享给大家,喜欢的可以关注和点赞哦~ 如文章中有不足之处求指正,谢谢 目录 ·什么是redis?为什 ...
- 缓存数据库-redis介绍
一:Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的 ...
- [技术博客] 用户验证码验证机制---redis缓存数据库的使用
目录 问题引入 初识redis 实际应用 作者:马振亚 问题引入 在这次的开发过程中,我们的需求中有一个是普通用户可以通过特定的机制申请成为社长.因为只有部分人才能验证成功,所以这个最开始想了两种思路 ...
- 缓存数据库memcache、redis原理对比
一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 (这里 ...
- Django缓存机制以及使用redis缓存数据库
目录 Django 配置缓存机制 缓存系统工作原理 Django settings 中 默认cache 缓存配置 利用文件系统来缓存 使用Memcache来缓存: 使用Local-memory来缓存: ...
随机推荐
- Java实现 LeetCode 372 超级次方
372. 超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: ...
- ClickHouse基本操作(一)
常用SQL 创建表 1 2 3 4 5 6 7 CREATE TABLE b6logs( eventDate Date, impid UInt64, uid String, idfa String, ...
- 数据结构之链表(Linked list)
说明:如果仔细阅读完全文后,可能感觉有些不统一,这里先说明下原因. 链表尾引用不统一:在介绍单链表时,只有一个链表首部的引用(head) 指向第一个节点.你看到后面关于双链表及循环列表时,除了指向第一 ...
- TCP最简单的服务程序
#include <time.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#in ...
- Flink 如何分流数据
场景 分流方式 如何分流 使用Filter分流 使用Split分流 使用Side Output分流 场景 获取流数据的时候,通常需要根据所需把流拆分出其他多个流,根据不同的流再去作相应的处理. 举个例 ...
- 分享我在前后端分离项目中Gitlab-CI的经验
长话短说,今天分享我为前后端分离项目搭建Gitlab CI/CD流程的一些额外经验. Before Gitlab-ci是Gitlab提供的CI/CD特性,结合Gitlab简单友好的配置界面,能愉悦的在 ...
- Python字符串处理 - str/bytes
目录 1. str 2. bytes / bytearray 3. printf-style String Formatting 1. str homepage str.count(sub[, sta ...
- python中的类型
python中的类型分为四种 1.整形 2.浮点型 3.字符串 4.对象(除了前三种,其他的都是对象) 比如函数也是对象 def fun(): print(123) type(fun) // < ...
- 检查*.ldf为何这么大
testdb,只是个测试用文件,备份时突然发现*.ldf怎么这么大,当硬盘不要花银子买啊......--可随意删除...,有空再检查,累了休息... 如批量生成数据.或导入那个来自MySQL的Empl ...
- SQL去掉重复数据
SELECT vc_your_email,vc_our_ref_or_code INTO #tmp FROM( SELECT vc_your_email,vc_our_ref_or_code,ROW_ ...