zoukankan      html  css  js  c++  java
  • Redis入门以及五大基本数据类型概述

    Redis入门

    概述

    Redis是什么

    Redis(Remote Dictionary Server),远程字典服务

    是一个免费、开源的C语言编写的、支持网络、基于内存的可持久化的日志型Key—Value数据库

    是当下最热门的NoSQL技术,也称为结构化数据库

    Redis能干嘛

    1.内存存储,持久化,内存中是断电丢失的,所以持久化是很重要的(RDB,AOF)

    2.效率高,用于高速缓存

    3.发布订阅系统

    4.地图信息分析

    5.计数器等(浏览量)

    特性

    1.支持多种数据类型

    2.集群

    3.事务

    4.支持多种语言接口

    5.持久化

    基础知识

    redis默认有16个数据库,默认的是第0个数据库

    select n选择第n个数据库(0-15)

    dbsize查看当前数据库大小

    keys * 查看所有key

    flushdb 清空当前数据库

    flushall 清空全部数据库

    Redis是单线程的

    Redis是很快的,Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是机器的内存和网络的带宽,既然可以使用单线程实现,就使用单线程

    Redis为什么单线程还这么快

    Redis是C语言写的,官网提供的数据为每秒10万+的QPS,完全不比Memecache差

    误区1:高性能的服务器都是多线程的

    误区2:多线程(CPU上下文会切换)一定比单线程效率高

    CPU速度>内存>硬盘

    核心 :redis是将所有数据全部放在内存中的,所以单线程操作效率就是最高的,对于内存系统来说,如果没有上下文切换,效率就是最高的!多次读写都是在一个CPU上,在内存情况下,这个就是最佳方案

    Redis 五大基本数据类型

    Redis-Key

    set key value 设置对应的键值

    get key 得到key对应的value

    exists key 查询是否存在key

    move key db 移动对应的key到第db个数据库

    expire key time 设置key 的自动过期时间 time秒

    ttl key 查询key的剩余存活时间

    type key 查看当前key的类型

    Redis中文网有详尽的命令

    String 字符串类型

    append key value 在key的字符串后追加value字符串,如果key不存在,则新建一个key

    strlen key 获取key对应value字符串的长度

    incr key key对应value+1

    decr key key对应value-1

    incrby key increment key对应value增长increment步长

    decrby key decrement key对应value减少decrement步长

    getrange key start end 截取字符串[start end]

    setrange key offset value 将偏移量为offset处的值替换为value

    setex (set with expire 设置过期时间)

    setnx (set if not exist)如果不存在再设置,存在则创建失败

    mset 批量设置k-v,空格分隔即可

    mget 批量获取

    msetnx 如果不存在则创建(原子操作,一个失败则所有都失败)

    进阶

    set/mset user : 1 {name:zhangsan ,age:3} 设置一个user:1对象,值为Json字符串来保存一个对象

    getset 先get再set,返回旧值,设置新值

    String类型的使用场景:value可以是字符串也可以是数字

    ​ 1.计数器

    ​ 2.统计多单位的数量 uid:851457617:follow 0

    ​ 3.粉丝数

    ​ 4.对象缓存存储

    List类型

    在redis里,List可以用成栈和队列、阻塞队列

    lpush 将一个或多个值插入到列表的头部

    lrange 从头部范围取值

    rpush 将一个或多个值插入到列表的尾部

    lpop 移除列表头部元素

    rpop 移除列表尾部元素

    lindex 通过下标获取list中的值

    llen 返回列表的长度

    lrem 移除指定的一个或多个key

    ltrim 通过下标截取指定的长度

    rpoplpush source des 移除列表的最后一个元素,并加入新的列表

    lset 将列表中指定下标的值替换为另外的值

    linsert 将某个具体的value插入到列表中某个元素的前面或者后面

    小结

    ​ list实际上是个链表,before after left right都可以插入值

    ​ 如果key不存在,创建新的链表

    ​ key存在,新增内容

    ​ 如果移除所有元素,则链表不存在

    ​ 在两端操作效率最高,中间元素相对来说效率会低一点

    消息排队!消息队列 Lpush Rpop

    ! 栈 Lpush Lpop

    Set类型

    set中的key是不重复、无序的

    sadd 向集合中添加元素

    smembers 查看所有元素

    sismember 判断是否是集合的元素

    scard 获取set集合中的元素个数

    srem 移除对应元素

    srandmember 随机抽出指定个数的元素 默认1

    spop 随机删除指定个数的元素 默认1

    smove 将一个指定的值,从一个集合移动到另一个set

    案例

    ​ 微博、B站的共同关注(交集)

    数字集合类:

    差集 :sdiff

    交集 :sinter 共同好友可以如此实现

    并集 :sunion

    Hash

    Map集合,key-Map集合,本质和String类没有太大区别

    hset 添加一个具体的key-value

    hget 获取对应集合对应字段的字

    hmset 批量设置key-value

    hmget 批量获取字段值

    hgetall 获取全部的数据

    hdel 删除hash指定key字段

    hlen 获取集合中键值对的个数

    hexists 判断hash中是否存在指定字段

    hkeys 获取所有key

    hvals 获取所有的value

    hincrby 指定增量

    hsetnx 如果不存在 则可以设置,存在则不设置

    案例

    hash变更的数据 user name age.用户信息的保存等,更适合对象的存储,String更适合字符串存储

    Zset(有序集合)

    在set基础上增加了一个值

    zadd 添加一个或多个值

    zrangebyscore 按照score进行排序 递增

    zrevrangebyscore 按照score进行排序 递减

    zrem 移除对应元素

    zcard 查询元素数量

    zcount 查询对应区间的元素数量

    其余API通过redis官网查询

    案例 : set排序,班级成绩排序,工资表排序

    ​ 权重消息,排行榜

  • 相关阅读:
    eval命令的使用
    declare与typeset的使用
    【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)
    【线型DP】【LCS】UVA_10635 Prince and Princess
    【经典DP】洛谷 P2782 友好城市
    HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)
    BZOJ3659 Which Dreamed It
    CF300D Painting Square
    CF632E Thief in a Shop 和 CF958F3 Lightsabers (hard)
    CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
  • 原文地址:https://www.cnblogs.com/dwwzone/p/13153045.html
Copyright © 2011-2022 走看看