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()
View Code

分享图片

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"))
View Code

在实例化的时候加上"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‘
{}
"""
View Code

(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‘}
View Code

四、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="123456",yuanyuan="613")

        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",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
不存在的用户名
"""
View Code

(额外补充)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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc