数据库学习04---NoSQL和Redis操作

数据库学习04–NoSQL和Redis

一、非关系型数据库(NoSQL)

1.简介

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。所以非关系型数据库更适合大数据!

2.关系型数据库遵循ACID规则

事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
(1A (Atomicity) 原子性
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。
(2)C (Consistency) 一致性
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。
(3)I (Isolation) 独立性
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。
(4)D (Durability) 持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

3、非关系CAP原理

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点

- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

不可能满足同时cap,一般都首选AP放弃C的使用

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

这里写图片描述

4、非关系型数据库类型

redis、mongodb

二、Redis系统介绍

1.REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

是一个基于内存的数据库,以字典的键值对形式,键值对,根据键立马就可以得到值。计算机里面,有内存,有硬盘文件都在硬盘中存放,代码在运行的时候,有一个变量a。
内存:读写快,但是断电消失,不大
硬盘:读写慢,但是可以持久化保存,大,随便存

redis官网:redis.io redis.cn

2.特点:

存储方式效率高,完全在内存中运行(内存读写纳秒级,比硬盘快很多)

单线程+异步I/O

3.运行场景:

用来做缓存:缓存热点数据、页面缓存、缓存查询结果

三、Redis安装和运行

可视化工具redis-desktop-manage

1.安装

(1).Widows安装:

注意:win中redis窗口不能关闭,不能后台运行

(1)windows
        Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,项目地址是:
        https://github.com/MicrosoftArchive/redis/releases
        下载msi安装包,安装过程需要将添加环境变量、过滤防火墙选中,内存使用默认100M即可
        配置文件  
            C:\Program Files\Redis\redis.windows.conf
        安装好之后通过   
            cd C:\Program Files\Redis
            redis-server.exe redis.windows.conf   启动redis
        新开一个cmd下输入  redis-cli   测试是否联通redis服务器,进入redis

(2).Ubuntu安装

(1)解压redis安装包
            tar -zxvf redis-3.2.8.tar.gz
        (2)进来安装文件夹
            cd redis-3.2.8/
        (3)编译
            make
        (4)查看/usr/local/bin有没有 redis-server  redis-cli
            cd src
            sudo cp redis-server /usr/local/bin
            sudo cp redis-cli /usr/local/bin
        (5)将配置文件复制到 /etc/redis 里面
            sudo mkdir /etc/redis
            sudo cp ~/redis-3.2.8/redis.conf /etc/redis
        (6)修改配置文件
            sudo vi redis.conf
                daemonize yes
        (7)启动redis服务
            redis-server /etc/redis/redis.conf
            查看有没有启动成功
            ps -ef | grep redis
        (8)客户端连接测试
            redis-cli
                输入ping,服务端回你pong

(3).CentOS版

1)安装redis
            tar -zxvf redis-3.2.8.tar.gz
            cp -r ./redis-3.2.8 /usr/local/redis
            cd /usr/local/redis
            make install
                如果有错,输入这个指令make MALLOC=libc
            cd src
            ./redis-server     //redis端口号默认为63792)、设置开机启动
            cd /usr/local/redis
            cp redis.conf redis_6379.conf
            vim redis_6379.conf128行    daemonize yes    #开启守护进程,可以后台运行 
            cd utils/
            cp redis_init_script redis_init_script_6379
            vim redis_init_script_6379             进入vi编辑对应的行内容
                EXEC=/usr/local/redis/src/redis-server
                CLIEXEC=/usr/local/redis/src/redis-cli
                CONF="/usr/local/redis/redis_6379.conf"
            启动   ./redis_init_script_6379 start
            查看是否启动   ps -ef | grep redis
            添加到开机启动中
                vim /etc/rc.local
                    添加一行
                    /usr/local/redis/utils/redis_init_script_6379 start

2.安装后运行redis常用操作

(1)启动后进入redis,运行redis-cli -h ip

[root@izwz9ao2nl8wvm ~]# redis-cli
172.18.182.114:6379> auth 123456      #有密码就输入密码登录    
OK

(2)查看安装好的版本

[root@izwz9ao2nlgaymeyr0z ~]# redis-server --version
Redis server v=4.0.10 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=8d13bdae3847a65b

(3)查看redis是否在运行

[root@izwz9ao2nl8wvmgaymeyr0z ~]# ps -ef | grep redis

3.配置密码等操作(备用)

(配置的时候我们一般选择复制一个文件,防止源文件丢失)—cp 要在根文件夹复制

命名为redis.conf

[root@i9ao2nl8wvmgaymeyr0z ~]# cp redis-4.0.10/redis.conf ./

编辑redis.conf====vim

[root@z9ao2nl8wvmgaymeyr0z ~]# vim redis.conf

进入编辑界面

(1)从末行模式esc—->(shift+:),进入ip界面,

!ifconfig

查询到内网地址

[No write since last change]
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.182.114  netmask 255.255.240.0  broadcast 172.18.191.255
        ether 00:16:3e:06:ba:2e  txqueuelen 1000  (Ethernet)
        RX packets 850345  bytes 916200262 (873.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 438762  bytes 72082464 (68.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enter返回到vim编辑状态

【补充】========【搜索功能】

命令模式下输入=====/+内容

(2)69行:改成内网ip

69 bind 172.18.182.114

(3)500行注释解除,可以重设定一个密码123456

 #requirepass foobared --->requirepass123456

**【理解】**218行save===持久化方案

 218 save 900 1       代表
 219 save 300 10
 220 save 60 10000         60秒内有10000个键值对发生变化会自动保存

(4)持久化补充方案修改

672 appendonly no------》改为appendonly yes
 702 appendfsync everysec

3.启动redis(若没有启动)=====后面&代表放在前台运行

root@izwz9ao2nl8wvmgaymeyr0z ~]# redis-server redis.conf &

查看运行环状态

4.启动Redis客户端===redis-cli

[root@izwz9ao2nl8wvmgaymeyr0z ~]# redis-cli -h 172.18.182.114 -p 6379(代表端口号)

输入auth+口令密码,反馈OK

输入ping反馈pong代表连接成功

172.18.182.114:6379> auth 123456
OK
172.18.182.114:6379> ping
PONG

四、Redis数据类型及常用命令

redis共有5中数据类型分别是: 字符串、队列、集合、哈希、有序集合

1.字符串命令

set key  value
    get key
    getrange key start end
        字符串提取,字符串从0开始,包含startend
    getset key value
        设置key的值,返回的是旧值,新值会设置成功
    setex key seconds value
        设置key的值,过期时间为seconds,如果存在,替换之,时间以s为单位
    setnx key valuekey不存在的时候才设置,存在不设置
    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 keykey对应的值增加1
        如果key不存在,那么先创建这个key,值为0,然后设置为1
        如果key对应的是字符串,那么报错
    incrby key number
        在指定的key对应的值加incre_amount
    decr key
        减一
    decrby key number
        减去指定的数量
    append key value
        在指定的key对应的值后面追加value
    mget
        一次获取多个键的值

(2)哈希:适合保存对象

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的多个属性的值

(3)列表(队列)

  lpush key value1 value2
        依次将value1和value2从左边插入到队列key中
    lrange key start stop     #注意没有lget,列表需要拿的是范围
        依次的显示队列key中从start开始到stop结束的所有元素
        start 0。。。。   stop -1代表最后一个
    lpushx key value
        当队列key存在的时候才往队列头部插入数据,如果队列不存在,插入失败
    lpop key
        弹出队列key中最左边的元素
    rpush key value1 value2
        将value从右边插入到队列key中
    rpushx key valuevalue从右边插入到队列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

lpush

172.18.182.114:6379> lpush list1 100 200 300 400
(integer) 4

lrange

72.18.182.114:6379> lrange list1 0 3     #拿出来的顺序是按照push进去的顺序,没有lget操作
1) "400"
2) "300"
3) "200"
4) "100"

左删除lpop

172.18.182.114:6379> lpop list1
"400"

右删除rpop

172.18.182.114:6379> rpop list1
"100"

(4)集合

集合具有无序性、唯一性

    sadd key value1 value2 value3
        往集合key中插入多个值
    scard key
        得到集合中元素的个数(注意不是用length)
    smembers key
        查看集合key中所有的元素
    sdiff key1 key2 key3
        保留key1中key2和key3没有的元素
        key1不变,结果返回给你
    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(查看是否是成员,1为真,0false)
    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中

sinter set1 set2 交集

sunion set1 set2 并集

sdiff set1 set2 差集

(5)有序集合

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

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

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

6.键命令

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  将指定键移动到指定库

五、其它常用命令

指令参考手册;redisdoc.com

1.创建===set

创建一个邮箱

172.18.182.114:6379> set email zhang@123.com
OK

2.获取===get

返回 key 所关联的字符串值。

如果 key 不存在那么返回特殊值 nil

假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值

172.18.182.114:6379> get email
"[email protected]"
redis> GET db
(nil)

redis> SET db redis
OK
redis> GET db
"redis"

3.创建电话号码===set tel

172.18.182.114:6379> set tel 123455

4.设置密码

 临时设置密码
        获取密码
            config get requirepass
        设置密码
            config set requirepass 123456
        当有密码的时候认证
            auth 密码
        取消密码
            config set requirepass ''
    永久设置密码
        到配置文件中设置
        requirepass 密码

4.设置间隔时间

172.18.182.114:6379> set tel 123455334 ex 30

5.TTL key

以秒为单位,返回给定 key 的剩余生存时间

172.18.182.114:6379> set tel 123455334 ex 30
OK
172.18.182.114:6379> get tel
"123455334"
172.18.182.114:6379> ttl tel
(integer) 15

7.

显示(integer) -1代表永不过期

判断是否发送过exist

del===删除一行或多组

save==强行保存

bgsave==后台保存

flushdb==清空所有键值对

select 5 切换到第五数据库(默认开启15个数据库,超过16会越界)

172.18.182.114:6379> select 5
OK
172.18.182.114:6379[5]> 
172.18.182.114:6379[5]> select 20
(error) ERR DB index is out of range

删除所有数据库的内容===flushall

172.18.182.114:6379[5]> flushall
OK

六、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文件

七、Python操作Redis

1.redis的操作命令及时代码也是函数

pycharm安装三方库
===pip install redis(全小写)
导入redis
    import redis

2.连接

import redis

# 连接redis数据库
'''
host : 主机
port : 端口号
db : 数据库
password : 密码
'''
r = redis.StrictRedis(host='localhost', port=6379)

# 使用r来进行操作你的redis服务器
# r.set('name', 'maodan')
# value = r.get('name')
# print(value)

# ret = r.hmset('ming', {'name': 'goudan', 'age': 30, 'height': 180})
# print(ret)

# ret = r.lpush('nba', '科比妻子', '斯嘉丽', '金卡戴珊', '科勒卡戴珊')
# print(ret)
# value = r.lpop('nba')

# print(value.decode('utf8'))

# ret = r.sadd('star', '郭德纲', '姜昆', '冯巩', '牛群', '郭德纲', '冯巩')

# ret = r.zadd('class', 100, '毛主席', 90, '蒋介石', 101, '孙中山', 0, '溥仪', -250, '慈禧老娘们')
# print(ret)
# ret = r.zrevrange('class', 0, -1, True)
# 返回的是一个列表,列表里面都是元组,元组第一个元素是成员,第二个元素是分值
# print(ret)

# ret = r.keys('*')
# print(ret)

# print(r.exists('girl'))

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/82530657