Redis数据库

Redis

关系型数据库(sql): MySQL, Oracle, SQLite, SQL Server, ...

非关系型数据库(nosql: not only sql 不仅仅是SQL): Redis, MongoDB, ...

一、Redis基础

1.概述

Redis 是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序。

Redis有三个主要特点,使它优越于其它键值数据存储系统 -

  • Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。

  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。

  • Redis可以将数据复制到任意数量的从机中, 分布式。

2.Redis的优点

  • 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。

  • 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题,因为我们知道哪些问题可以更好使用地哪些数据类型来处理解决。

  • 操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值。

  • 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

3.Redis与其他键值存储系统

  • Redis是键值数据库系统的不同进化路线,它的值可以包含更复杂的数据类型,可在这些数据类型上定义原子操作。

  • Redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度。

  • 内存数据库的另一个优点是,它与磁盘上的相同数据结构相比,复杂数据结构在内存中存储表示更容易操作。 因此,Redis可以做很少的内部复杂性。MySQL:关系型数据库 sqlRedis: 非关系型数据库 nosql => not only sql 是sql的补充

4、redis安装和连接

4.1 redis简介

​ redis:也是一个数据库​ 数据库:​ 关系型数据库​ 数据在磁盘中存放,有表结构,内部有很多数学算法等​ 非关系型数据库​ redis(基于内存)数据都存放在内存中,提供了持久化保存的机制​ mongodb 存放的kv:key-value

4.2 redis安装
    redis:官方网站   redis.io
    Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,项目地址是:
    https://github.com/MicrosoftArchive/redis/releases
    下载msi安装包:
        安装过程一路next,默认选项即可,需要将添加环境变量、过滤防火墙选中,内存使用默认100M即可
        
4.3 添加环境变量:
    将C:\Program Files\Redis添加到环境变量path中
    
4.4 启动redis
    安装好之后通过   
        a,  cd C:\Program Files\Redis
        b,  redis-server redis.windows.conf   (启动redis)
        
4.5 使用redis
    新开一个cmd下,输入redis-cli,然后输入ping来测试是否联通redis服务器
​
键命令
        0-15:redis默认有16个数据库,默认是在第0个数据库中操作
        select num:切换数据库  (*)
        keys *:所有键   (*)
        del key:删除键   (*)
        EXPIRE key seconds:给指定的key添加过期时间,单位是s  (*)
        ttl key:以秒为单位,返回这个键剩余的时间秒数  (*)
        exists key:判断一个键是否存在  (*)
        flushdb: 删除当前数据库中所有的键  (*)
        flushall:删除所有数据库中的键  (*)

5、redis函数

​ 五种数据类型:​ 字符串(string)、哈希(字典)、列表(list)、集合(set)、有序集合(zset)​

三种交互模式
    a, 指令交互:在cmd窗口
    b, 客户端交互: 可视化工具
    c, 代码交互:python代码操作redis
​
redis数据类型
    字符串String, 哈希Hash, 列表list, 集合Set,有序集合ZSet
指令:
    字符串 string
        set key value: (*)
            设置key-value
        get key : (*)
            获取key所对应的value
        
        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 key1 value1 key2 value2 key3 value3
            同时设置多个键值对
        mget
            一次获取多个键的值
        msetnx
            同时设置多个键值对,键都不存在的时候才设置
        psetex key time value
            设置键值对,时间以ms为单位
            
        incr key  (*)
            为key对应的值增加1
            如果key不存在,那么先创建这个key,值为0,然后设置为1
            如果key对应的是字符串,那么报错
        incrby key number
            在指定的key对应的值加number
        decr key
            减一
        decrby key number
            减去指定的数量
            
        append key value
            在指定的key对应的值后面追加value

哈希 hash

        name : 'zs',   #  string类型
        name: { a:1,  b:2, c:3  }   # 字典类型
        
        # user = {name:xiaohong, age:33, sex:man} 
​
        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
    应用场景:
     1.消息队列:redis的lpush-brpop命令组合即可实现阻塞队列,生产者客户端使用lpush命令向列表插入元素.消费者客户端使用brpop命令阻塞式的"抢"列表中的尾部元素.多个客户端保证消息的负载均衡与可用性.
     2.文章列表:每个用户都有属于自己的文章列表.此时可以考虑使用列表,因为列表不但是有序的,同时支持使用lrange按照索引范围获取多个元素.
        # list = [1, 2, 3, 4]
                
        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

集合

    集合 set
        无序性、唯一性
    应用场景:
        集合类型比较典型的使用场景是标签(tag).例如一个用户可能对音乐感兴趣,另一个用户对新闻感兴趣,这些想去点就是标签.有了这些数据就可以获得喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验来说比较重要.
        
        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中
        sunion key1 key2
            得到集合key1和集合key2的并集
        sunionstore dst key1 key2
            将集合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元素

有序集合

    有序集合 zset 
    应用场景:   有序集合相对于哈希、列表、集合来说会有一点陌生,但既然叫有序集合.那么它和集合必然是有着联系,它保留了集合不能重复元素的特性.但不同的是,有序集合是可排序的.但是他和列表使用索引下标进行排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据.
    
        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 100 30   # 逆序排列所有成员
        zscore key member  (*)
            返回指定成员的分数

二、Python操作redis

​ python代码交互​ 1、安装 pip install redis​ 2、使用

import redis
​
# 连接redis数据库
# 默认连接的是0数据库
redis = redis.StrictRedis()
​
# 操作
result = redis.keys()
​
redis.set('sex',"girl")
redis.set('name',"申阳坚")
# print(result)
print(redis.get("name").decode())   # 申阳坚
​
redis.rpush("stars","马大元","大源媳妇","霍尊","张哲瀚","吴亦凡")
result = redis.lrange("stars",0,-1)
for i in result:
    print(i.decode())
​
# 关闭连接
redis.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值