zoukankan      html  css  js  c++  java
  • Redis

    概念

    什么是Redis?

    Reids是开源、支持网络、基于内存、可持久化的键值对存储的非关系型数据库。默认端口号为6379。

    应用场景

    缓存、排行榜、计数器(incr|decr)、分布式会话、分布式锁、社交网络、最新列表、消息系统

    基本数据类型

    string、list、set、hash、zset(有序的set)

    特殊数据类型get

    geospatial:地理位置

    hyperloglog:基数统计

    bitmap:位图0/1,适用描述于只有两种状态

    常用命令

    在redis判断命令中,返回1代表真,0代表假;redis命令不区分大小写

    辅助命令

    select 数据库序号,以0为起始,切换数据库,redis默认有16个数据库
    dbsize 查看数据库使用的大小
    keys * 查看所有的键
    flushdb 清空当前数据库
    fulushall 清空所有数据库
    expire key 10 使用key在10s后失效
    move key db 将当前数据库的key移动到另一个db
    del key1 key2 ... 删除key
    type key 查看key对应value的类型
    exists key 是否存在key
    

    string

    字符串

    set key value
    get key value
    mset key1 value1 key2 value2 ...
    mget key1 key2 ...
    getrange key 0 3 获取[0,3]范围的字符串,如"123456"得"1234"
    setnx key value 不存在该key才可以设置,分布式锁常用到
    setex key 3 value 设置临时key,3s后失效
    append key value 在原key对应的值追加value
    strlen key 查看该key对应的value的长度
    incr key key对应的value自增1
    decr key 自减1
    incrby key step 自增step
    decrby key step 自减step
    

    list

    有序、重复的数据结构

    lpush list value1 value2 ... 头插入
    rpush list value1 value2 ... 尾插入
    lrange list 0 -1 遍历  0 1查看第一个和第二个
    lpop list 去头
    rpop list 去尾
    lindex list 0 查看下标为0的元素
    llen list 获取长度
    lrem list count element 删除指定个数的指定元素
    ltrim list 0 1 截取[0,1]
    lset list 2 value 修改下标为2的元素的值为value
    linsert list before/after 3 value 在值为3之前/之后插入value
    

    set

    无序、不可重复的数据结构

    sadd set value1 value2 ...
    smembers set 遍历
    sismemeber set value 判断value是否在集合中
    scard set 获取集合元素的个数
    srem set value1 value2 ... 删除元素
    srandmember set count 随机获取count个元素
    spop set count 随机删除count个元素
    smove set1 set2 3 将set1中的3移动到set2
    ###########################
    以set1为基准
    sdiff set1 set2 ... 求差集
    sinter set1 set2 ... 求交集
    sunion set1 set2 ... 求并集
    ###########################
    

    hash

    存储key-value的数据结构,适用于存储对象

    hset hash key value 
    hget hash key
    hmset hash key1 value1 key2 value2 ...
    hmget hash key1 key2 ...
    hgetall hash 获取所有键值对
    hdel hash key 删除键值对
    hlen hash 获取键值对个数
    hexists hash key 是否存在key
    hkeys 获取所有key
    hincrby hash key 2 使hash中的key对应的值增加2
    hsetnx hash key value 不存在才创建
    

    zset

    有序、元素不重复的数据结构

    zadd zset index1 value1 index2 value2  ...
    zrange zset 0 1  获取[0,1]的元素  [0,-1]遍历
    zrem zset value1 value2 ... 删除元素
    zcard
    

    三种特殊的数据结构

    #################################################################
    geospatial 地理位置
    geoadd key 经度 纬度 名称
    geodist geo 名称1 名称2 m|km  计算距离
    geopos geo 名称 获取经纬度
    georadius geo 经度 纬度 1000 m|km 获取以该经纬度为中心附近1000m|km的名称
    georadiusbymember geo 名称 1000 m|km 以该名称为中心附近的1000m|km的名称
    #################################################################
    
    #################################################################
    hyperloglog 基数统计
    #################################################################
    
    #################################################################
    bitmaps 存储0/1两个状态
    #################################################################
    setbit sign 1
    setbit sign 0
    setbit sign 2 //error
    bitcount sign 1 统计状态为1的个数
    

    Redis事务

    概念

    本质上就是一组命令的集合,一个事务会经历三个步骤:开始事务、命令入队、执行事务。

    redis不存在隔离级别的概念。

    执行情况分为三种

    • 编译器错误,所有命令都不执行(如命令语法错误)
    • 运行期错误,发生错误的命令不执行其余执行(如set插入了相同元素)
    • 都执行成功

    命令

    • 开始事务:multi
    • 执行事务:exec
    • 取消事务:discard

    Redis实现乐观锁

    演示 (watch/unwatch)

    ###############################################
    初始化数据
    set money 100   //假设有100块
    set expenses 0   //消费金额
    ###############################################
    
    ###############################################
    线程1
    watch money    //开始监视,相当于为money加了乐观锁
    multi  //开启事务
    incrby expenses 10 //消费了10块
    decrby money 10  //余额减少10块
    // exec   假设此时还来得及执行该事务,线程2已经修改了money
    ###############################################
    
    ###############################################
    线程2
    set money 300
    ###############################################
    
    ###############################################
    线程1
    exec 执行事务时返回nil,表示事务执行失败
    ###############################################
    
    unwatch   如果之前已经watch了,先执行该命令取消监视,再watch
    

    Jedis

    概念

    Jedis是官方提供的Java连接Redis开发工具,使用Java操作Redis

    导入依赖

    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.3.0</version>
    </dependency>
    

    使用方式和命令一样的

    Jedis jedis = new Jedis("127.0.0.1", 6379);
    System.out.println(jedis.ping());
    System.out.println(jedis.set("key", "value"));
    System.out.println(jedis.get("key"));
    jedis.close();
    
  • 相关阅读:
    KMP算法的理解和代码实现
    关于线程死锁
    PAT1018
    PAT1059
    PAT1009
    PAT1006
    PAT1005
    PAT1004
    PAT1002
    PAT
  • 原文地址:https://www.cnblogs.com/main404/p/13328925.html
Copyright © 2011-2022 走看看