day39-Redis和MongoDB

1. Redis

  1. redis函数学习
    Redis数据类型:字符串、队列、集合、哈希、有序集合
    临时设置密码
    获取密码
    config get requirepass
    设置密码
    config set requirepass 123456
    当有密码的时候认证
    auth 密码
    取消密码
    config set requirepass ''
    永久设置密码
    到配置文件中设置
    requirepass 密码
    配置其他机器可以连接,打开redis配置文件
    bind 127.0.0.1 这句话注释掉
    protected_mode no 这句话yes修改为no
    重启才能生效 干掉这个进程重新打开

  2. redis持久化机制rdb
    持久化:在内存中的数据不能保存,如果想要保存需要保存到硬盘中
    redis的数据就是在内存中的,如果将redis关掉,再去打开,数据就不在了
    redis有持久化机制,就是rdb机制
    stop-writes-on-bgsave-error yes 后台写入的时候,停止文件写入
    rdbcompression yes 写文件的时候有压缩格式
    rdbchecksum yes 对rdb文件校验
    dbfilename dump.rdb 保存的rdb文件的文件名
    dir ./ 保存的文件的路径

    可以手动保存 redis-cli bgsave
    复制过来,替换这个文件,下次启动的时候就是使用的新的rdb文件

  3. python操作redis
    import redis
    每一个指令到代码中都是一个函数,然后输入和输出就会变成函数的输入和输出

  4. Redis数据类型指令:

字符串

set key value
get key

getrange key start end
字符串提取,字符串从0开始,包含start和end
getset key value
设置key的值,返回的是旧值,新值会设置成功
setex key seconds value
设置key的值,过期时间为seconds,如果存在,替换之,时间以s为单位
setnx key value
该key不存在的时候才设置,存在不设置
setrange key offset value
将该key对应的值从offset开始替换为value
strlen key
得到该key对应的值的长度
mset
mset key1 value1 key2 value2 key3 value3
同时设置多个键值对
msetnx
同时设置多个键值对,将键不存在的时候才设置
psetex key time value
设置键值对,时间以ms为单位
incr key
为key对应的值增加1
如果key不存在,那么先创建这个key,值为0,然后设置为1
如果key对应的是字符串,那么报错
incrby key number
在指定的key对应的值加incre_amount
decr key
减一
decrby key number
减去指定的数量
append key value
在指定的key对应的值后面追加value
mget
一次获取多个键的值

哈希(对象)

hset key field value
给对应的key设置属性和属性值
hsetnx key field value
该key中不存在的field才设置为value
hget key field
获取指定key的field属性
hdel key field1 field2
删除对应key中指定的属性
hexists key field
对应的key中是否存在这个属性,存在返回1,不存在返回0
hgetall key
获取这个key对应的所有的属性和值
hincrby key field number
给这个key对应的属性值加减number
hincrbyfloat key field number
给这个key对应的属性值加减number,number为float值
hkeys key
对应的key中所有的属性名
hvals key
对应的key中所有的值
hlen key
对应的key有多少个属性
hmset key field1 value1 field2 value2 ...
同时为key设置多个属性和属性值
hmget key field1 field2 ...
同时获取key的多个属性的值

列表 list 队列

lpush key value1 value2
依次将value1和value2从左边插入到队列key中
lrange key start stop
依次的显示队列key中从start开始到stop结束的所有元素
start 0。。。。 stop -1代表最后一个
lpushx key value
当队列key存在的时候才往队列头部插入数据,如果队列不存在,插入失败
lpop key
弹出队列key中最左边的元素
rpush key value1 value2
将value从右边插入到队列key中
rpushx key value
将value从右边插入到队列key中,但是前提是队列key必须存在
rpop key
将队列key中最右边的元素弹出
rpoplpush src dst
将队列src中最右边的元素插入到队列dst中的最左边
ltrim key start stop
将队列中start-stop区间之外的所有元素全部干掉
闭区间
lset key index value
将队列key中的第index个元素设置为value
下标从0开始
llen key
得到队列key中元素的个数
lindex key index
获取队列key中第index个元素
lrem key count value
count > 0 从最左边开始,干掉count个和value相等的元素
count < 0 从最右边开始,干掉-count个和value相等的元素
count = 0 干掉队列key中所有和value相等的元素
linsert key before|after value newvalue
在队列key中的value的前面或者后面插入newvalue

集合

无序性、唯一性
sadd key value1 value2 value3
往集合key中插入多个值
scard key
得到集合中元素的个数
smembers key
查看集合key中所有的元素
sdiff key1 key2 key3
保留key1中key2和key3没有的元素
sdiffstore dst key1 key2 key3
将这个(sdiff key1 key2 key3)的结果保留到集合dst中
sinter key1 key2
取出key1和key2的交集
sinterstore dst key1 key2
将sinter key1 key2的结果保存到集合dst中
sismember key value
判断value在不在集合key中,在的话返回1,不在的话返回0
smove src dst value
将集合src中的value元素移动到集合dst中
spop key
从集合key中随机弹出一个元素
srandmember key count
count > 0 count < 集合元素个数: 返回你一个数组,而且数组元素唯一
count > 集合元素个数:返回你该集合中所有的元素
count < 0:返回给你-count个元素,但是不保证唯一
srem key value1 value2
移除集合key中的value1和value2元素
sunion key1 key2
得到集合key1和集合key2的并集
sunionstore dst key1 key2
将集合key1和集合key2的并集保存到dst中

有序集合

zadd key score member
将分值为score的成员member加入到有序集合key中
zcard key
得到集合key中元素的个数
zcount key start stop
得到集合key中分值在start到stop之间的元素的个数
zincrby key number member
给集合key中指定的member元素的分值加上number

zrange key start stop [withscores]
显示集合中的元素

zrangebyscore key min max
按照区间去查找对应的元素 min和max
【注】前面的只能写数字,肯定是大于等于,后面的可以写开区间,不写默认就是闭区间
0 (100 0<= <100
0 100 0<= <=100
默认升序排列好
zrank key value
从低到高排列,下标从0开始
查找value在有序集合key中的排名 显示的是下标
zrem key member1 member2
移除有序集合中指定的元素

zrevrange key start stop withscores
查询从start到stop之间所有的元素,但是是从大到小排列
zrevrank key value
用法和zrank一样,但是是从大大小排列的顺序
【注】得到的是下标
zrevrangebyscore key max min
ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成员
zscore key member
返回指定成员的分数

键命令

0-15:redis默认有16个数据库,默认是在第0个数据库中操作
select num:切换数据库
keys *:所有键
del key:删除键
EXPIRE key seconds:给指定的key添加过期时间,单位是s
ttl key:以秒为单位,返回这个键剩余的时间秒数
exists key:判断一个键是否存在
flushdb: 删除当前数据库中所有的键
flushall:删除所有数据库中的键
rename key newkey #修改key的名称(如果新的key的名字存在 则会把存在的key的值 覆盖掉)
randomkey #随机返回一个 key
move key db 将键移动到指定库

2. MongoDB

MongoDB也是一个数据库,是一个NoSQL,非关系型数据库,开源免费
支持-windows、linux、mac
直接保存在硬盘中,保存的数据类似json格式,字典格式

一、操作mongodb数据库

  1. 创建数据库
    语法:use 数据库名
    注意:如果数据库不存在则创建数据库,否则切换到指定的数据库
    注意:如果刚刚创建的数据库不在列表内,如果要显示它,我们需要向刚刚创建的数据库中插入一些数据
    ( db.star.insert({name:"tom", age:18, gender:1,address:"北京", isDelete:0}) )
  2. 删除数据库
    前提:使用当前数据库(use 数据库名)
    db.dropDatabase()
  3. 查看所有数据库
    show dbs
  4. 查看当前正在使用的数据库
    a、db
    b、db.getName()
  5. 断开连接
    exit
  6. 查看命令api
    help

区别:
mysql mongodb
database db(数据库)
table collection(集合)
一行数据 文档(document)

二、集合操作

  1. 查看当前数据库下有哪些集合
    show collections
  2. 创建集合
    a、
    语法:db.createCollection("集合名")
    示例:db.createCollection("class")
    b、
    语法:db.集合名.insert(文档)
    示例:db.student.insert({name:"tom", age:18, gender:1,address:"北京", isDelete:0})

区别:两者的区别在于前者创建的是一个空的集合,后者创建一个空的集合并添加一个文档

  1. 删除当前数据库中的集合
    语法:db.集合名.drop()
    示例:db.class.drop()

  2. mysql中插入数据:
    insert into user(id,name,age,money) values(1,'王宝强',30,3000)
    更新数据
    update user set age=50 where id=1
    删除数据
    delete from user where id=1
    查询
    select * from user where age between 20 and 30
    【注】MongoDB中添加数据,字段可以不一样

三、文档操作

  1. 插入文档
    a、使用insert()方法插入文档
    语法:db.集合名.insert(文档)
    插入一个:db.student.insert({name:"刘欢", age:19,address:"北京", isDelete:0})
    语法:db.集合名.insert([文档1, 文档2, ……, 文档n])
    插入多个:db.student.insert([{name:"马德华", age:17,address:"北京", isDelete:0},{name:"凤凰女", age:20,address:"上海", isDelete:0}])
    b、使用save()方法插入文档
    语法:db.集合名.save(文档)
    说明:如果不指定_id字段,save()方法类似于insert()方法。如果指定_id字段,则会更新_id字段的数据
    示例1:db.student.save({name:"科比", age:22,address:"洛杉矶", isDelete:0})
    示例2:db.student.save({_id:ObjectId("59950962019723fe2a0d8d17"),name:"姚明", age:23,address:"休斯顿", isDelete:0})
  2. 文档更新
    a、update()方法用于更新已存在的文档
    语法:
    db.集合名.update(
    query,
    update,
    {
    upsert:<boolean>,
    multi:<boolean>
    }
    )
    参数说明:
    query:update的查询条件,类似于sql里update语句内where后面的内容
    update:update的对象和一些更新的操作符(set,inc)等,set直接更新,inc在原有的基础上累加后更新
    upsert:可选,如果不存在update的记录,是否当新数据插入,true为插入,False为不插入,默认为false
    multi:可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就按照条件查找出来的数据全部更新

需求:将刘德华的年龄更新为25
示例:

              db.student.update({name:"刘德华"},{$set:{age:25}})
              累加:db.student.update({name:"刘德华"},{$inc:{age:25}})  
              全改:db.student.update({name:"刘德华"},{$set:{age:42}},{multi:true})  

b、save()方法通过传入的文档替换已有文档
必须有_id这个键才是更新
语法:

                db.集合名.save(
                    document
                )
            参数说明:
                document:文档数据
  1. 文档删除
    说明:在执行remove()函数前,先执行find()命令来判断执行的条件是否存在是一个良好习惯
    也可以使用查询中的and和or
    语法:
            db.集合名.remove(
                query,
                {
                    justOne:<boolean>
                }
            )

参数说明:
query:可选,删除的文档的条件
justOne:可选,如果为true或1,则只删除一个文档

示例:db.student.remove({name:"刘德华"})

4 .文档查询
a、find()方法
语法:db.集合名.find()
查询集合下所有的文档(数据):db.student.find()
b、find()方法查询指定列

            语法:db.集合名.find(
                query,
                {
                    <key>:1,
                    <key>:1
                }
            )

参数说明:
query:查询条件
key:要显示的字段,1表示显示
示例:
查询指定条件,只显示name和age
db.student.find({isDelete:0},{name:1,age:1})
查询所有只显示name和age键值
db.student.find({},{name:1,age:1})

c、pretty()方法以格式化方式来显示文档
示例:db.student.find().pretty()
其实就是字典形式显示

d、findOne()方法查询匹配结果的第一条数据
示例:db.student.findOne({isDelete:0})

  1. 查询条件操作符
    作用:条件操作符用于比较两个表达式并从Mongodb集合中获取数据
        a、大于 - $gt   greater than
            语法:db.集合名.find({<key>:{$gt:<value>}})
            示例:db.student.find({age:{$gt:20}})
        b、大于等于 - $gte  equal
            语法:db.集合名.find({<key>:{$gte:<value>}})
        c、小于 - $lt   less than
            语法:db.集合名.find({<key>:{$lt:<value>}})
        d、小于等于 - $lte
            语法:db.集合名.find({<key>:{$lte:<value>}})
        e、大于等于 和 小于等于 - $gte 和 $lte
            语法:db.集合名.find({<key>:{$gte:<value>,$lte:<value>}})
        f、等于 - :
            语法:db.集合名.find({<key>:<value>})
        g、使用_id进行查询
            语法:db.student.find({"_id":ObjectId("id值")})
            示例:db.student.find({"_id":ObjectId("5995084b019723fe2a0d8d14")})
        h、查询某个结果集的数据条数
            db.student.find().count()
        i、查询某个字段的值当中是否包含另一个值
            语法:
            示例:db.student.find({name:/love/}) 包含ile
        j、查询某个字段的值是否以另一个值开头
            示例:db.student.find({name:/^li/}) 开头
            示例:db.student.find({name:/li$/}) 结尾

正则表达式:匹配一类东西,邮箱、url、手机号、qq号

        单字符匹配:\d \D \w \W \s \S . [a-f]
        数量修饰:{5} {2,} {2,4} + * ?
        子模式:()  \1  \2
        边界: ^  $  \b \B
        修正:re.I  re.M  re.S
  1. 条件查询and 和 or
    a、AND条件
    语法:db.集合名.find({条件1,条件2,……,条件n})
    示例:db.student.find({isDelete:0,age:{$gt:16}})
    b、OR条件
    语法:
                db.集合名.find(
                    {
                        $or:[{条件1},{条件2},……,{条件n}]
                    }
                )
            示例:db.student.find({$or:[{age:17},{age:{$gte:20}}]})

c、AND和OR联合使用
语法:

                db.集合名.find(
                    {
                        条件1,
                        条件2,
                        $or:[{条件3},{条件4}]
                    }
                )
                sex是女
                age>30
                height=160 or height=158
            db.star.find({sex:'女',age:{$gt:30},$or:[{height:160},{height:158}]})
  1. limit、skip
    limit 偏移量,数量 20条数据,每页显示4条
    a、limit():读取指定数量的数据记录
    db.student.find().limit(3)
    b、skip():跳过指定数量的数据
    db.student.find().skip(3)
    c、skip与limit联合使用
    通常用这种方式来实现分页功能
    示例:db.student.find().skip(3).limit(3)
    20条数据,每页显示4条,直接得到第三页所有数据
    db.star.find().skip((3-1)*4).limit(4)

  2. 排序
    语法:db.集合名.find().sort({<key>:1|-1})
    示例:db.student.find().sort({age:1})
    注意:1表示升序,-1表示降序

     db.star.find({sex:'女'}).sort({age:1,height:-1})
     先按照年龄升序排列,然后按照身高降序排列
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容