FunRec-task2

task2熟悉数据库

(Datawhale32期组队学习)

基础点

  • MySQL
    • 用处
    • 简介
    • 安装
    • 预备知识
    • 基本操作
    • 运算符
    • 分组查询
    • 数据增删改查
    • Pymysql
    • eg
  • MongoDB
    • 用处
    • 简介
    • 特点
    • 安装
    • 集合
    • 文档
    • 排序
    • PyMongo
  • Redis

知识点

1 MySQL

1.1用前需要知道的
1.1.1用处
  • 构建物料池
    • 存储结构化的数据(用户、新闻特征)
  • 增删改查、排序
  • 统计数据,抽取特征
1.1.2简介
1.1.3安装
  • Linux
  • Win
  • 创建用户:create user 'yxx'@'localhost' identified by 'yxx;
  • 给用户权限:grant all privileges on *.* to 'yxx'@'localhost' with grant option;
  • 刷新系统权限:FLUSH PRIVILEGES;
  • 修改密码:ALTER USER 'yyx'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql321';
1.2 预备知识
1.2.1规范
  • 分号结尾
  • 关键字不区分大小写
  • 插入表内数据区分大小写
1.2.2命名规则
  • 不重复,同一库下不能有2张相同的表
  • 半角英文开头
  • 半角英文字母、数字、下划线(_)作为数据库、表和列的名称

3.数据类型

  • 数值
    • 整型数据:TINYINTINTEGERSMALLINTMEDIUMINTDECIMALNUMERICBIGINT
    • 浮点型数据:DECIMALFLOATREALDOUBLE PRECISION)
  • 时间:表示时间值的日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR
  • 字符串类型:CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET
1.3基本操作

1.创建

CREATE DATABASE [IF NOT EXISTS] <数据库名称>;

2.查看

SHOW DATABASES [LIKE '数据库名'];
SHOW CREATE DATABASE <数据库名>;

3.选择

USE <数据库名>

4.删除

DROP DATABASE [IF EXISTS] <数据库名>
1.4表

表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

1.创建

CREATE TABLE <表名><字段1> <数据类型> <该列所需约束><字段2> <数据类型> <该列所需约束><字段3> <数据类型> <该列所需约束><字段4> <数据类型> <该列所需约束>.
   .
   .
   <该表的约束1><该表的约束2>,……);
  • CHAR为定长字符,这里CHAR旁边括号里的数字表示该字段最长为多少字符,少于该数字将会使用空格进行填充。

  • VARCHAR表示变长字符,括号里的数字表示该字段最长为多少字符,存储时只会按照字符的实际长度来存储,但会使用额外的1-2字节来存储值长度。

  • PRIMARY KEY:主键,表示该字段对应的内容唯一且不能为空。

  • NOT NULL:在 NULL 之前加上了表示否定的NOT,表示该字段不能输入空白。

  • SHOW TABLES命令来查看当前数据库下的所有的表名

  • DESC <表名>来查看表的结构

2.删除

DROP TABLE <表名>;

-- 例如:DROP TABLE Product;
  • DROP删除的表示无法恢复的

3.更新

--创建表
CREATE TABLE Student(
  id INT PRIMARY KEY,
  name CHAR(15)
);

DESC student;
-- 结果如下
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int      | NO   | PRI | NULL    |       |
| name  | char(15) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
  1. 更改表名:RENAME命令,将表名从Student => Students。
ALTER TABLE Student RENAME Students;
  1. 插入新的字段:通过ADD命令,新增字段sex和age。
-- 不同的字段通过逗号分开
ALTER TABLE Students ADD sex CHAR(1), ADD age INT;

-- 其它插入技巧:
-- 通过FIRST在表首插入字段stu_num
ALTER TABLE Students ADD stu_num INT FIRST;

-- 指定在字段sex后插入字段height
ALTER TABLE Students ADD height INT AFTER sex;
  1. 字段删除:通过DROP命令,可以对不在需要的字段进行删除
-- 删除字段stu_num
ALTER TABLE Students DROP stu_num;
  1. 字段修改:通过MODIFY修改字段的数据类型。
-- 修改字段age的数据类型
ALTER TABLE Students MODIFY age CHAR(3);
-- 通过`CHANGE`命令,修改字段名或类型
-- 修改字段name为stu_name,不修改数据类型
ALTER TABLE Students CHANGE name stu_name CHAR(15);

-- 修改字段sex为stu_sex,数据类型修改为int
ALTER TABLE Students CHANGE sex stu_sex INT;

4.查询
通过SELECT语句,可以从表中取出所要查看的字段的内容

SELECT <字段名>, ……
  FROM <表名>
 WHERE <条件表达式>;

5.复制

-- 将整个表复制过来
CREATE TABLE Product_COPY1
	SELECT * FROM Product;

-- 通过LIKE复制表结构
CREATE TABLE Product_COPY2
	LIKe Product;
1.5运算符

1.算术

  • 四则运算所使用的运算符**(+、-、*、/)**称为算术运算符
  • NULL的计算结果,仍然还是NULL
  • (),括号中的运算表达式优先级会得到提升

2.比较
-=;<>;>=;>;<=;<

  • 不能对NULL使用任何比较运算符,只能通过IS NULL语句来判断

3.逻辑

  • not、AND、OR
  • NULL和任何值做逻辑运算结果都是不确定;不确定(UNKNOWN)
1.6分组查询

1.聚合函数

  • COUNT:计算表中的记录数(行数)
  • SUM: 计算表中数值列中数据的合计值
  • AVG: 计算表中数值列中数据的平均值
  • MAX: 求出表中任意列中数据的最大值
  • MIN: 求出表中任意列中数据的最小值

注意:

  • 除了COUNT可以将*作为参数,其它的函数均不可以
  • 当将字段名作为参数传递给函数时,只会计算不包含NULL的行。
  • MAX/MIN函数几乎适用于所有数据类型的列,包括字符和日期。SUM/AVG函数只适用于数值类型的列。

2.对表分组-GROUPBY

SELECT <列名1>, <列名2>, <列名3>, ……
 FROM <表名>
 GROUP BY <列名1>, <列名2>, <列名3>, ……;
  • 使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的字段名。

3.where语句(对过滤)
先使用WHERE对表进行条件过滤,然后再进行分组处理。

SELECT <列名1>, <列名2>, <列名3>, ……
 FROM <表名>
 WHERE 
 GROUP BY <列名1>, <列名2>, <列名3>, ……;
  • WHERE语句中,不可以使用聚合函数。WHERE子句只能指定**记录(行)**的条件,而不能用来指定组的条件。
  • WHERE MAX(purchase_price) > 1000这样的语句是非法的。使用HAVING语句

4.为聚合结果指定条件-HAVING(对过滤)

SELECT <列名1>, <列名2>, <列名3>, ……
 FROM <表名>
 GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>
  • 常数
  • 聚合函数
  • GROUP BY子句中指定的字段名(即聚合键)

5.对表查询结果排序-ORDERBY

SELECT <列名1>, <列名2>, <列名3>, ……
 FROM <表名>
 ORDER BY <排序基准列1>, <排序基准列2>, ……
  • 降序 DESC
1.7数据增删改查

1.插入:通过命令INSERT,可以向表中插入数据

-- 往表中插入一行数据
INSERT INTO <表名> (字段1, 字段2, 字段3, ……) VALUES (1,2,3, ……);

-- 往表中插入多行数据
INSERT INTO <表名> (字段1, 字段2, 字段3, ……) VALUES 
	(1,2,3, ……),
	(1,2,3, ……),
	...
	;

2.删除:通过DROP TABLE或者DELETE语句,可以对表进行删除

  • DROP TABLE 语句可以将表完全删除
  • DELETE 语句会留下表结构,而删除表中的全部数据。

3.更新:UPDATE

UPDATE <表名>
	SET <字段名> = <表达式>;
UPDATE <表名>
	SET <列名> = <表达式>
	WHERE <条件>;
1.8Pymysql

使用python完成:

  1. 登陆并连接到MySQL下的用户;
  2. 切换到相应的数据库下;
  3. 完成对表的增删改查;

具体:

  1. 安装
#
python3 -m pip install PyMySQL
  1. 连接
import pymysql
# 这里登陆到我之前创建的admin账户
db = pymysql.connect(
     host='localhost',
     user='yxx',
     password='mysql123',
     database='shop',				
     charset='utf8mb4',
     cursorclass=pymysql.cursors.DictCursor
)
  1. 创建游标
# 创建游标
cursor = db.cursor()
#指定游标类型
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
# `Cursor`: 默认,元组类型
# `DictCursor`: 字典类型
# `SSCursor`: 无缓冲元组类型
# `SSDictCursor`: 无缓冲字典类型
  1. 类方法
  • connect下的类方法:

    • close():在完成操作后,需要关闭与数据库之间的连接;
    • commit():如果执行语句中发生了数据更改,需要提交更改到稳定的存储器;
    • cursor(cursor=None):创建一个游标,前面我们在初始化connect类是指定了游标类型,通过cursor初始化游标时,也可以进行游标类型指定;
    • rollback():事务回滚;
  • pymysql.cursors下的类方法:

    • close():结束时,关闭游标;
    • execute():通过游标执行语句;
    • executemany():通过游标执行多条语句;
    • fetchone():获取单条数据;
    • fetchmany(size=None):获取size条数据;
    • fetchall():获取单条数据;
    • scroll(value, mode):数据的查询操作都是基于游标,可以通过scroll控制游标的位置。
      • mode=absolute:绝对位置移动,控制游标位置到上一次查询的第value条数据,最小值为0
      • mode=relative:相对位置移动,基于当前位置,跳过value条数据;

2 MongoDB

2.1用前需要知道的
2.1.1用处
  • MongoDB数据库在该项目中会用来存储画像数据(用户画像、新闻画像),使用MongoDB存储画像的一个主要原因就是方便扩展,因为画像内容可能会随着产品的不断发展而不断的更新。作为算法工程师需要了解常用的MongoDB语法(比如增删改查,排序等),因为在实际的工作可能会从MongoDB中获取用户、新闻画像来构造相关特征。
2.1.2 简介
  • 由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
  • 在高负载的情况下,添加更多的节点,可以保证服务器性能。
  • 可扩展的高性能数据存储解决方案
  • 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
2.1.3 特点
  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单
2.1.4 安装

task1已总结

2.2 集合

1.创建createCollection

  • "show dbs" 命令可以显示所有数据的列表。

  • 执行 “db” 命令可以显示当前数据库对象或集合。

  • 运行"use"命令,可以连接到一个指定的数据库。如果数据库不存在,则创建数据库(集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。)

  • show dbs ,查看所有数据库

  • db.createCollection(name, options)创建集合

    • options:
字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId布尔3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size数值(可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。
  • show collectionsshow tables:查看已有集合

2.删除drop

  • db.collection.drop()
2.3文档

1.插入: 使用 insert() 或 save() 方法向集合中插入文档

db.COLLECTION_NAME.insert(document)
#或
db.COLLECTION_NAME.save(document)
  • save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne()db.collection.replaceOne() 来代替。
  • insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

2.更新

  • update() 方法:更新已存在的文档。
db.collection.update(
   <query>,# update的查询条件,类似sql update查询内where后面的。
   <update>,#update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
   {
     upsert: <boolean>,#可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
     multi: <boolean>,#可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
     writeConcern: <document>#可选,抛出异常的级别
   }
)

3.删除:remove() 函数是用来移除集合中的数据

  • 注意:先执行 find() 命令来判断执行的条件是否正确
db.collection.remove(
   <query>,#(可选)删除的文档的条件。
   {
     justOne: <boolean>,#(可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
     writeConcern: <document>#(可选)抛出异常的级别
   }
)

#只想删除第一条找到的记录可以设置 justOne 为 1
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
#想删除所有数据
db.col.remove({})

4.查询: find() 方法

db.collection.find(query, projection)
#query :可选,使用查询操作符指定查询条件
#projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
#以易读的方式来读取数据,可以使用 pretty() 方法
>db.col.find().pretty()
  • 传入多个键(key),每个键(key)以逗号隔开(AND)
db.col.find({key1:value1, key2:value2}).pretty()
  • 关键字 $or(or)
db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
  • 可联合使用
2.4排序

sort()对数据进行排序, 1 为升序排列,而 -1 是用于降序排列

db.COLLECTION_NAME.find().sort({KEY:1})
2.5Python MongoDB

1.安装

 python3 -m pip install pymongo

2.创建数据库

import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017/")
mydb=myclient["pydb"]
#判断指定的数据库是否存在
dblist = myclient.list_database_names()
# dblist = myclient.database_names() 
if "pydb" in dblist:
  print("数据库已存在!")
else:
  print('数据库不存在')

3.创建集合

import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017/")
mydb=myclient["pydb"]

mycol=myclient["col_set"]
#判断集合是否已存在
collist = mydb. list_collection_names()
if "col_set" in collist:   # 判断 sites 集合是否存在
  print("集合已存在!")
else:
  print('集合不存在')

4.插入文档inset()

import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
 
mydict = { "name": "Toby", "age": "23", "url": "https://juejin.cn/user/3403743731649863" }
x = mycol.insert_one(mydict) 
print(x)
#插入多个
mylist = [
  { "name": "Tom", "age": "100", "url": "https://juejin.cn/user/3403743731649863" },
  { "name": "Mary", "age": "101", "url": "https://juejin.cn/user/3403743731649863" },
  { "name": "Timi", "age": "10", "url": "https://juejin.cn/user/3403743731649863" },
]
x = mycol.insert_many(mylist)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)

命令行查看是否插入成功:

use pydb
db.col_set.find()

5.查询文档:find()

import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
 
#查询 **col_set** 文档中的第一条数据
x = mycol.find_one()
print(x)
#查找 **col_set** 集合中的所有数据
for x in mycol.find():
  print(x)
#查询指定字段的数据,将要返回的字段对应值设置为 1
for x in mycol.find({},{ "_id": 0, "name": 1, "age": 1 }):
  print(x)
#根据指定条件查询
myquery = { "name": "Toby" }
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)

#对查询结果设置指定条数的记录可以使用 **limit()** 方法,该方法只接受一个数字参数
myresult = mycol.find().limit(3)
# 输出结果
for x in myresult:
  print(x)

5.修改文档:update_one() 方法

如果查找到的匹配数据多于一条,则只会修改第一条。

import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
  
myquery = { "age": "23" }
newvalues = { "$set": { "age": "12345" } }
 
mycol.update_one(myquery, newvalues)
 
# 输出修改后的  "sites"  集合
for x in mycol.find():
  print(x)

6.排序:sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
  
mydoc = mycol.find().sort("age")
for x in mydoc:
  print(x)

7.删除数据:

  • delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据
  • delete_many()** 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
  
myquery = { "name": "Timi" }
 #删除一个文档
mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
  print(x)

#删除集合中的所有文档
x = mycol.delete_many({})
print(x.deleted_count, "个文档已删除")

8.删除集合:drop() 方法来删除一个集合

import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["pydb"]
mycol = mydb["col_set"]
  
mycol.drop()

3 Redis

3.1用前需要知道的
3.1.1简介
  • Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。
  • 内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。
  • Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存使用。
  • Redis 不仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
  • Redis 支持主从复制,即 master-slave 模式的数据备份。
3.1.2 安装

task1已介绍

3.2 命令

1.基本

  1. 启动Redis
redis-server [--daemonize yes][--port 6379]
redis-server /etc/redis/redis.conf
  1. 连接Redisredis-cli [-h host -p port -a password]
  2. 停止Redis
redis-cli shutdown
kill redis-pid
  1. 切换库指令:redis.conf配置中默认16个库,下标从0~15。进入客服端默认选中第0个库,可以通过select命令进行切换,index表示库的小标。
127.0.0.1:6379> SELECT index
  1. 删除当前库的数据127.0.0.1:6379[1]> FLUSHDB
  2. 删除所有库的数据127.0.0.1:6379[1]> FLUSHALL
  3. 查看key的数量127.0.0.1:6379> DBSIZE

2.Key操作命令:对数据库中的key进行增删改查等一些列操作

#查找符合模板的Key
KEYS pattern

#查找存在key的数量
EXISTS key or [key…]

#设置过期时间
EXPIRE key seconds#expire #设置 key 的过期时间,时间过期后,key 会被自动删除,设置成功返回1,key不存在返回0。
 TTL key#ttl 命令以秒为单位返回key的剩余过期时间,如果key不存在返回 -2  key 存在但没有关联超时时间则返回 -1 。

#Key所属类型
TYPE key
#以字符串的形式返回存储在 `key` 中的值的类型,可返回的类型有:`string`, `list`, `set`, `zset`,`hash` 和 `stream`,如果key值不存在返回`none`

#删除Key
DEL key or [key…]
 

3.String

  • set:将key是定为指定的字符串,如果key存在,则会覆盖原来的值。
  • get:get命令返回与键 key 相关联的字符串值。
  • APPEND:将指定的key追加值。如果key存在,并且是字符串,则会将value追加到key原值的末尾,如果key值是非字符串则会报错,当key不存在时候,改命令类似于set,简单将key设定为value。
  • INCR:将 key 中储存的数字值增一。如果key不存在,key值会被初始化为0,在进行incr操作。如果字符串类型的值不能表示为数字,则会报错
  • DECR:将 key 中储存的数字值减一,和incr命令相似
  • Strlen 命令将获取指定 key 所储存的字符串值的长度,如果key存储的不是字符串类型或不存在时,返回错误。
  • Setrange命令是将从偏移量 offset 开始, 用 value 参数覆盖键 key 储存的字符串值。
  • Getrange命令返回存储在 key 中的字符串的子串,由 startend 偏移决定(都包括在内)。负数偏移提供相对字符串结尾的偏移。并且该命令会通过将结果范围限制为字符串的实际长度来处理超出范围的请求。
  • 命令设置多个 key 的值为各自对应的 value。如果key存在,则会用新值替换旧值,如果key不存在,会重新创建,该命令总是返回“OK”,因为 MSET不会失败。
  • 命令返回所有(一个或多个)给定 key 的值,值的类型是字符串。 如果给定的 key 里面有某个 key 不存在或者值不是字符串,那么这个 key 返回特殊值 nil

4.列表-list

  • Lpush 将一个或多个值插入到列表key 的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。如果 key 对应的值不是 list 类型,那么会返回一个错误。可以使用一个命令把多个元素 push 进入列表。
  • Rpush 将向存储在 key 中的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是列表,那么会返回一个错误。
  • Lrange将返回列表中指定区间内的元素(闭区间),区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如果start大于最大小标,那么叫返回空列表。
  • Lindex 将返回列表 key 里索引 index 位置存储的元素。 index 下标是从 0 开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素,在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。当 key 值不是列表的时候,会返回错误。
  • Llen 将用于返回存储在 key 中的列表长度。 如果 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
  • Lrem将用于从列表 key 中删除前 count 个值等于 element 的元素。 这个 count 参数通过下面几种方式影响这个操作,如果count > 0, 从头到尾删除值为 value 的元素;如果count < 0,将从尾到头删除值为 value 的元素;如果 count = 0 将移除所有值为 value 的元素
  • Lset 将用于设置列表 key 中 index 位置的元素值为 element
  • Linsert 将用于把 element 插入到列表 key 的前面或后面。当 key 不存在时,这个list会被看作是空list,什么都不执行;当 key 存在,值不是列表类型时,返回错误。

5.hash命令

  • Hset 命令用于为存储在 key 中的哈希表的 field 字段赋值 value 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段(field)已经存在于哈希表中,旧值将被覆盖。
  • Hget 命令用于返回哈希表中指定字段 field 的值。如果给定的字段或 key 不存在时,返回 nil 。
  • Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段,如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。
  • Hgetall 命令用于返回存储在 key 中的哈希表中所有的域和值。返回值以列表形式返回哈希表的字段及字段值,若 key 不存在,返回空列表。
  • Hdel 命令用于删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 如果 key 不存在,会被当作空哈希表处理并返回 0
  • Hexists 命令用于查看哈希表的指定字段field 是否存在。如果表含有给定字段field会返回1,否则返回0。
  • Hkeys返回存储在 key 中哈希表的所有域。当 key 不存在时,返回空表。
  • Hvals 命令返回哈希表所有域(field)的值。当 key 不存在时,返回空表。

6.set

  • Sadd 将命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含被添加的元素作为成员的集合。当集合 key 不是集合类型时,返回一个错误。
  • Smembers 将返回存储在 key 中的集合的所有的成员。 不存在的集合被视为空集合。
  • Sismember 将用于判断元素 member 是否集合 key 的成员。如果成员元素是集合的成员,返回 1 ;如果成员元素不是集合的成员,或 key 不存在,返回0。
  • Scard 将返回集合中元素的数量。
  • Srem将在集合中删除指定的元素。如果指定的元素不是集合成员则被忽略。如果集合 key 不存在则被视为一个空的集合,该命令返回0。如果key的类型不是一个集合,则返回错误。
  • Srandmember 将仅使用key 参数,那么随机返回集合key 中的一个随机元素。如果count是整数且小于元素的个数,返回含有 count 个不同的元素的数组,如果count是个整数且大于集合中元素的个数时,返回整个集合的所有元素,当count是负数,则会返回一个包含count的绝对值的个数元素的数组,如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况。
  • Spop 将从集合 key中删除并返回一个或多个随机元素。这个命令和 SRANDMEMBER相似, SRANDMEMBER 只返回随机成员但是不删除这些返回的成员。

7.有序集合:sortedset

  • Zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 memberscore 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD操作。当 key 存在但不是有序集类型时,返回一个错误。score 值可以是整数值或双精度浮点数,score 可为正也可以为负。
  • Zrange将返回有序集中,指定区间内(闭区间)的成员,其中成员的按分数值递增(从小到大)来排序,具有相同分数值的成员按字典序(lexicographical order )来排列。如果你需要成员按值递减(从大到小)来排列,可以使用 ZREVRANGE命令。下标参数 startstop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。其中 start和stop参数的细节同 ZRANG命令。
  • Zervrange 将返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从高到低)来排列。具有相同score值的成员按字典序的反序排列。 除了成员排序相反外,ZREVRANGE命令的其他方面和ZRANGE命令一样。
  • Zrem 将从有序集合key中删除指定的成员member。如果member不存在则被忽略。当key存在,但是不是有序集合类型时,返回类型错误。返回的是从有序集合中删除的成员个数,不包括不存在的成员。
  • Zcard 将返回有序集的成员个数。 当 key 不存在时,返回 0
  • ZRANGEBYSCORE:该指令将返回有序集 key 中,所有 score 值介于 minmax 之间(包括等于 minmax )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
  • ZREVRANGEBYSCORE:该指令将返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。可选的LIMIT参数指定返回结果的数量及区间(类似SQL中SELECT LIMIT offset, count)。注意,如果offset太大,定位offset就可能遍历整个有序集合,这会增加O(N)的复杂度。可选参数WITHSCORES会返回元素和其分数,而不只是元素。
  • Zcount 将返回有序集 key 中, score 值在 minmax 之间(默认包括 score 值等于 minmax )的成员的数量。
3.3 Python调用Redis

1.安装

python -m pip install redis

2.连接

  • 直连模式
import redis

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='')
r.set('name':'jiangyou')
print(r.get('name'))
  • 连接池模式
import redis

pool = redis.ConnectionPool(host="127.0.0.1",port=6379,db=0,password="",decode_responses=True, max_connections=10)
r1 = redis.Redis(connection_pool=pool)   #  第一个客户端访问
r2 = redis.Redis(connection_pool=pool)   #  第二个客户端访问

3.操作

  • String
  • Hash
  • List
  • Set
  • SortedSet
  • 管道

个人需要补充的点

  1. 进一步熟悉三大数据库
  2. 试用下python调用

参考

  1. https://github.com/datawhalechina/fun-rec
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值