缓存数据库之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实现机器人行走
某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). 例如,我们可以对小车输入如下的指令: ...
- Linux 最大有效权限与删除ACL
最大有效权限mask mask是用来指定最大有效权限的.如果给用户赋予了acl权限,则需要与mask权限”相与“才能得到用户的真正权限 setfacl -m m:rx 文件名,指定最大有效权限.例如: ...
- postman接口超时设置,用于debug等断点调试
Settings->General->Request Timeout in ms(0 for infinity):设置请求超时的时间,默认为0
- 8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- 【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean
写在前面 在上一篇关于Spring的@Import注解的文章<[Spring注解驱动开发]使用@Import注解给容器中快速导入一个组件>中,我们简单介绍了如何使用@Import注解给容器 ...
- 【分区】使用 GPT 分区表分区并格式化 (FreeBSD 系统)
1. 查看磁盘列表 使用命令 diskinfo -v /dev/vtbd1 查看磁盘设备列表. 2. 创建 GPT 分区 1). 执行命令 gpart create -s gpt vtbd1.2). ...
- (一)TestNG-常用注解参数
原文:https://www.cnblogs.com/starstarstar/p/11305733.html 注解@Test标签 package com.course.testng; import ...
- android中getWidth()和getMeasuredWidth()之间的区别
先给出一个结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个 ...
- 记录一次Flink作业异常的排查过程
最近2周开始接手apache flink全链路监控数据的作业,包括指标统计,业务规则匹配等逻辑,计算结果实时写入elasticsearch. 昨天遇到生产环境有作业无法正常重启的问题,我负责对这个问题 ...
- 《Redis开发与运维》
第1章 初识Redis 1. Redis介绍: Redis是一种基于键值对(key-value)的NoSQL数据库. 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).has ...