NoSQL-redis with python
首先,先去看了一下NoSQL的概念:
Wiki中参考的NoSQL终极指南(nosql-database.org)中说:
NoSQL DEFINITION:
Next Generation Databases mostly addressing some of the points: being non-relational, distributed,
open-source and horizontally scalable.
NoSQL的定义:下一代数据库主要是解决一些要点:非关系型,分布式的,开放源码和支持横向扩展。
四大非关系型数据库,对于我小白来说,个人认为此文总结得很好,https://www.onmpw.com/m/view.php?aid=88
前言:
(一).自己对redis理解的笔记
Redis:NoSQL中最简单的一种,键值对(Key-Value)内存(In-Memory)数据库,具有极高的并发读写性能。使用Redis来解决一些高并发及缓存场景。redis常用场景:http://blog.jobbole.com/88383/
比如,网站首页可用redis存放,提高加载速度。直播排行榜很多都是用redis,因为需要实时更新。数据需要经常性交互的场景,都可以用redis。百万级并发的网站,会用到redis,MySQL是顶不住的。
redis使用C语言编写,所以性能特别好。同时redis可以定时把内存数据同步到磁盘,将数据持久化。
redis是把数据放在内存中的,从内存中直接读数据,比任何硬盘都要快,哪怕硬盘是苹果闪存!正是因为redis基于内存这个特点,所以redis没有I/O阻塞。
MySQL与redis相比,MySQL就有I/O瓶颈。就像电脑卡,有两个主要原因:1.计算瓶颈:CPU不行,处理不过来。2.I/O瓶颈:CPU给力,但硬盘不给力。比如100个文件同时打开,CPU吃得消,但硬盘读取跟不上了。
redis高可用:挂了一台redis服务器,另一台redis服务器顶上。切换就几秒钟的时间。
而且它可以分布式分片集群:相当于宁波一台redis服务器,北京一台redis服务器,青岛一台redis服务器。每个区域访问它自己区域的redis服务器(当然也可以跨区域访问)。一定程度上减轻了服务器负担。
(二).看下当今排行前十的数据库(https://db-engines.com/en/ranking)
(1).Oracle
收费,高富帅用的。好!确实相当好,相当牛逼。但一套服务就是好几百万(你有钱,Oracle就是最好的选择),私企基本不会选它。
也就传统的大型企业可能用得上,如铁路系统、银行、国企。
(2).MySQL
09年被Sun收购,后来Oracle收购了Sun。
Oracle的德性就把MySQL闭源了,开始收费。但仍在提供免费的社区版。
(3).MS SQL Server
适合初学者,捆绑,还收费。
(4).PostgreSQL
做运维的会比较熟悉它。
(5).MongoDB
文档数据库。能够碾压其他NoSQL数据库,自有它的闪光点。未来会学到它,而且学习成本相对很低。
(6).DB2
IBM的数据库,收费。即是关系型,也是非关系型。据说做数据挖掘很好用,不过俺不会 — . —。
曾在校园招聘时,与一位面试官提到了DB2和Oracle(09年的事情了)。那位面试官有段话,我记得特别清楚,当然他那么说也是为IBM做广告,宣传作用。
"Oracle最近几年确实叫得很响,但DB2是数据库中的数据库"。真要这么牛逼为啥没前三呢?
(7).MS ACCESS
emmmmmmm..............
(8).Elasticsearch
用它实现搜索引擎很容易。
(9).Redis
(10).MariaDB
这个数据库是MySQL作者开发的。与MySQL很像,基本一样。两者可以相互导来导去。
MySQL被Oracle收购后,Oracle对其闭源。MySQL作者担心MySQL会毁在Oracle手里,就做出了这个MariaDB来代替。
因为开源,而且与MySQL很像,未来它会进入Top10
一、进入redis环境
用XShell链接高手老师给的Linux环境,直接打命令:redis-cli,即可进入redis数据库。redis的默认端口:6379
redis默认有16个数据库,即db0~db15,一般存取数据如果不指定库的话,默认都是存在db0中。
(一).redis中,最常见的五种数据类型:
(1).string 字符串
(2).list 列表
(3).hash 哈希。key-value,value是字典:{"name":"quanquan616","age":30}
(4).set 集合
(5).sorted-set 有序集合
(二).python3中的redis模块
redis提供两个类Redis和StrictRedis,StrictRedis用于实现大部分官方的命令,Redis是StrictRedis的子类,用于向后兼用旧版本。
二、string(用得最多)
(一).原生态操作
(1).语法:"set 键名 值";获取值:"get 键名"
因为键是唯一的,如果再"set name zyb",就会把原来的值覆盖。
如果值有空格,那么就需要引号引起来。没有空格,可加可不加。
通过set的数据类型,都是string。
(2).设置过期时间(对已存在的key设置过期时间)
上例中的键值对数据是永久存在的,不会过期。但是,数据存放在内存中,不设置过期时间,数据越来越多导致撑爆内存,内存溢出。然后死机……
语法:expire keyname seconds
1代表设置成功;"ttl keyname"查看还有几秒过期,-2表示过期了,-1表示永不过期;nil是空的意思。
对一个不存在的key设置过期时间,语法:"set keyname value ex seconds"或"setex keyname seconds value"
(3).追加
语法:"append keyname value",末尾追加的
为什么是(integer)6?"zyb"长度是3,末尾追加的"123"的长度也是3,那么合起来长度就是6
(4).设置多个key-value
语法:"mset key value key value ..."(set前面加个"m",然后设置多个键值对)
要设置过期的话,得一个个去设置了。
(5).获取多个
语法:"mget key key key ..."(get前面加个"m")
(6).查看类型
语法:"type keyname"
(7).删除key
语法:"del keyname"
删除一个不存在的key,会返回0,表示失败。
(8).获取所有的key
语法:"keys *"。这个语法还带有一点正则:"keys m*"匹配以m开头的所有key,"*"表示匹配所有。
(9).查看key是否存在
语法:"exists keyname",有的话,返回1(真);没有的话,返回0(假)
(10).运算(如果value是字母,就会报错)
比如视频、文章的点击量,就可以用到redis来存储。
•加法:"incr keyname" -> 每一次调用此语法,都相当于自加1
"incrby keyname int"自己设置加多少数值。如果int为负数,那么相当于减法了。
•减法:"decr keyname"
"decrby keyname int"自己设置减多少数值。如果int为负数,那么就是加法了(负负得正)
(二).使用python3操作:
import redis conn = redis.Redis(host="127.0.0.1", port=6379) # 实例化 # set string : conn.set("key","value")
conn.set("name", "张三") # get string : conn.get("key")
print(conn.get("name")) # b'\xe5\xbc\xa0\xe4\xb8\x80\xe8\xb4\x9d' 二进制 bytes
print(conn.get("name").decode("utf-8")) # 张三 # 运算
print(conn.get("read_count")) # b'2'
conn.decr("read_count") # 减1
# conn.decr("read_count", amount=30) # amount指定多少值
print(conn.get("read_count")) # b'1' # 设置多个值
conn.mset(p1="pp1", p2="pp2") # p1 p2 是key # 设置过期时间
conn.expire("p1", 10)
print(conn.ttl("p1")) # 获取多个
print([i.decode("utf-8") for i in conn.mget("name", "marry")]) # ['张三', 'false']
# conn.mget()返回的是列表 无法直接使用 .decode()方法。得一个个遍历出来 然后一个个 .decode()
import redis s_redis = redis.StrictRedis(host="127.0.0.1", port=6379, decode_responses=True)
s_redis.set("name", "莹莹")
print(s_redis.get("name"))
在实例化的时候加上"decode_responses=True",这样字段中有中文,也可以在pycharm操作redis的时候显示了。
三、hash操作(value是一个map,即key-field-value的结果)
value是个json格式的数据。key中包含了一些(字符-值)
(一).原生态操作
(1).设置/获取
设置语法:"hset key field value";获取语法:"hget key field"
(2).删除
语法:"hdel key field"
(3).设置/获取多个
设置语法:"hmset key field [key field]";获取语法:"hmset key field field"
(4) .获取全部
语法:"hgetall key" 获取全部的key和value
语法:"hkeys key" 获取key里面所有的field(属性)
语法:"hvals key"获取全部value
(二).使用python3操作
(1).例1:
import redis pool = redis.ConnectionPool(host="localhost", port=6379)
r = redis.Redis(connection_pool=pool) r.hmset("author", {"name": "zb", "sex": "male"}) # 在hash中,批量设置键值对
print(r.hgetall("author"))
print(r.hmget("author", "name")) # [b'zb']
print(r.hget("author", "name")) # b'zb'
r.delete("author")
print(r.hgetall("author")) """
运行结果: {b'name': b'zb', b'sex': b'male'}
b'zb'
{}
{b'name': b'zb', b'sex': b'male'}
[b'zb']
b'zb'
{}
"""
(2).例2:
import redis conn = redis.Redis(host="127.0.0.1", port=6379) # 设置一个哈希
conn.hset("website", "google", "www.google.com")
# 相当于原生态中的 : hset website google www.google.com # 设置多个哈希
conn.hmset("website", {"baidu": "www.baidu.com", "taobao": "www.taobao.com"})
# 第二个参数要传字典 # 获取多个哈希
print(conn.hgetall("website"))
# {b'baidu': b'www.baidu.com', b'taobao': b'www.taobao.com', b'google': b'www.google.com'}
四、list列表
(一).原生态操作
(1).左添加/右添加
左添加语法:"lpush key value";右添加语法:"rpush key value"
(2).查看元素
语法:"lrange key start_index stop_index"
查看全部,例:"lrange key 0 -1"
(3).获取列表的元素个数
语法:"llen key"
(4).查看位于索引位置上的元素
语法:"lindex key index"
(5).删除
删除左边:"lpop key"
删除右边:"rpop key"
指定删除:"lrem key count value";count值为0的话,全部删除;count值大于0的话,从前往后删几个元素;count值小于0的话,从后往前删几个元素。
五、set集合
与python的集合特性一样,集合中的元素"无序且唯一"
(一).原生态操作
(1).设置/获取
设置语法:"sadd key value value ...";获取语法:"smembers key"
(2).删除
指定删除的语法:"srem key element"
随机删除的语法:"spop key"
(3).移动一个集合的值到另一个集合(把元素剪切过去了)
语法:"smove oldkey newkey member"
(4).查看集合中是否有某个元素
语法:"sismember key value"
(5).获取集合有多少个元素
语法:"scard key"
六、zset有序集合
(一).原生态操作
(1).设置/获取
设置语法:"zadd key 位置序号 value ...";
获取语法:正序:"zrange key start_index stop_index";逆序:"zrevrange key start_index stop_index"
注:如果设置已有元素的位置编号,虽然返回的状态是0,但其实已经改变了它的位置。
(2).删除
语法:"zrem key element"
(3).获取长度
语法:"zcard key"
(4).查看元素的序号
语法:"zscore key element"
(5).返回位置序号在min-max之间,有几个元素
语法:"zcount key min max"
七、如何获取redis的官方帮助文档:
在redis交互命令中敲入:help @类型名称。如:help @string
八、Redis持久化:
何为持久化?从内存保存到磁盘中。
持久化的策略:
(一).RDB持久化
指定时间内,数据快照。记录整个过程。(比如每1分钟拍照一次)
优点:简单粗暴。
缺点:会导致暂停服务,数据有差池。
(二).AOF持久化
记录所有写的操作,保存在一个文件中。(因为只有写入操作,才会对数据库发生改变)
要恢复了,就执行那个文件即可。
九、修改密码
自己学习的redis是没有设置密码的,设置密码虽然是运维的事,不过知晓一下,也是好的。
密码是在配置文件中,路径:/etc/redis/redis.conf。命令:sudo vim /etc/redis/redis.conf
找到:requirepass foobared这行。按i进入插入模式,把前面的注释删掉,把"foobared"也删掉,写上自己的密码。保存退出。
"sudo service redis-server restart"重启服务,redis-cli还是可以进入,但是任何操作都会提示权限不足。
"auth 你自己设置的密码"就可以了。
十、案例
案例1:
"""
Python3操作redis
模拟用户登录
""" import redis class RedisLogin:
"""登录模块""" def __init__(self, user, pwd):
# 预设置一些key-value 方便后续演示
r.mset(zyb="", yuanyuan="") self.user = user
self.pwd = pwd def login(self):
ls = []
for key in r.keys():
ls.append(key)
"""
keys()获取redis中所有的键,然后放入列表中。
那么列表中存放的,都是从redis中读出来的键。
键全都是字符串类型。
""" if self.user not in ls:
# 如果传过来的那个user参数,不在列表中,那么就是没有这个键。
print("不存在的用户名") # 此例中,就是不存在这个用户名
elif r.get(self.user) == self.pwd:
# redis是通过键来取值
# 取到user这个键的值,且等于传过来的pwd。那么此例中就是帐号密码配对成功了
print("登录成功")
else:
print("登录失败") if __name__ == '__main__':
r = redis.StrictRedis(host="127.0.0.1", port=6379, decode_responses=True)
# decode_responses=True必须写,不然返回的全是二进制 b'' while 1:
user_name = input("Enter user name :")
user_pwd = input("Eenter your password :")
user_login = RedisLogin(user_name, user_pwd) # 实例化
user_login.login() # 用实例去调用方法 """
运行结果: Enter user name :yingying
yingying
Eenter your password :613
613
登录成功
Enter user name :zzz
zzz
Eenter your password :aaa
aaa
不存在的用户名
"""
(额外补充)windows7 32bit中安装及使用redis:
redis对Linux系统是完美支持,官方不支持windows系统。不过 Microsoft Open Tech group 搞了个64位的版本。
本人的32位系统,真是很蛋疼。好在运气不错,下载来一个可以成功启动的redis 32bit "redis-windows-x86-2.8.2104.zip"。
(一).解压。路径不能有空格,不能是中文。(数字不知道行不行,反正别折腾了,windows下能用redis已经要庆幸了)
(二).首先启动server
(1).进入windows命令模式(Win+R)
(2).进入这个文件所在的文件夹路径
(3).直接执行这个exe文件。
*(2).(3).也可以合并成一步:直接写完整绝对路径,回车。
成功的话,显示如下图:(redis默认端口为6379)
注意了:这个是服务器了,不要关!窗口叉了,客户端就连不上了!
(三).然后cli连接server,并且进行测试
(1).另外开一个命令窗口
(2).执行这个文件
成功:
(3).测试一下
(四).为python安装redis模块(好像是废话,必须安装,不然怎么搞?)
pip install redis
NoSQL-redis with python的更多相关文章
- Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》
首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...
- Redis的Python客户端redis-py的初步使用
1. Redis的安装 sudo pip install redis sudo pip install hiredis Parser可以控制如何解析redis响应的内容.redis-py包含两个Par ...
- (转)NoSQL——Redis在win7下安装配置的学习一
NoSQL——Redis在win7下安装配置的学习一 有些也是从网上看来的 1.下载安装 Redis它没有windows的官方版本,但是又非官方的版本,到官网上去下载相应的版本,我的电脑是win7 ...
- redis与python交互
import redis #连接 r=redis.StrictRedis(host="localhost",port=6379,password="sunck" ...
- LinuxMint上安装redis和python遇到的一些问题
今天在安装Redis和Python上遇到了些问题,解决后记录下来. 环境:LinuxMint 18.3 安装redis sudo wget http://download.redis.io/relea ...
- Redis在python中的使用
一 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...
- 转载 NoSQL | Redis、Memcache、MongoDB特点、区别以及应用场景
NoSQL | Redis.Memcache.MongoDB特点.区别以及应用场景 2017-12-12 康哥 码神联盟 本篇文章主要介绍Nosql的一些东西,以及Nosql中比较火的三个数据库Red ...
- redis & macOS & python
redis & macOS & python how to install python 3 on mac os x? https://docs.python.org/3/using/ ...
- NoSQL&&Redis介绍
再说Redis之前,想先说一下NoSQL.在最早的单机时代,随着数据的增加一台机器可能放不下了.同时索引占用的内存空间也会越来越大.对请求的读写操作影响很大.于是就在数据库之前增加了一层保护层 — 缓 ...
- Redis与python
一.Redis介绍 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库(非关系型数据库). 本质:将数据保存在内存中. 用途:缓存.消息队列. 1.Redis的特点 R ...
随机推荐
- [TypeScript] Custom data structures in TypeScript with iterators
We usually think of types as something that can define a single layer of an object: with an interfac ...
- Vue 前端路由 vue-router
1.前端路由 后端路由:多页面,服务器端渲染好返回给浏览器. 前端路由:改变url不向服务器发送请求:前端可以监听url变化:前端可以解析url并执行相应操作. 前后端分离:后端只提供API来返回数据 ...
- LIME:模型预測结果是否值得信任?
花了一天时间对LIME论文:http://arxiv.org/pdf/1602.04938v1.pdf 细致阅读和代码阅读,实验.大体理解了作者的设计思路. 背景: 我们在建立模型的时候,常常会思考我 ...
- LeetCode题目:Spiral Matrix II
原题地址:https://leetcode.com/problems/spiral-matrix-ii/ class Solution { public: vector<vector<in ...
- Array,Vector,List,Deque的区别与联系【转+改】
数组 内存连续分配,长度大小固定,内置的最基础的数据结构之一.支持随机访问和随机存储. 该类型数据所占内存空间最小. Vector 是C++ STL中的一个容器.和数组类似,它拥有一段连续的内存空间, ...
- Spring 注解Autowired自动注入bean异常解决
错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined ...
- SDUTOJ 2775 小P的故事——奇妙的饭卡
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUl9NaXNheWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- curl 重定向问题
今天在curl一个网站的时候遇到一个奇怪的问题,下面是输出: lxg@lxg-X240:~$ curl -L http://www.yngs.gov.cn/ -v * Hostname was NOT ...
- hdu 3641 数论 二分求符合条件的最小值数学杂题
http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*================================= ...
- ucos-ii变量名称表