zoukankan      html  css  js  c++  java
  • Redis五大数据类型

    引用学习:https://space.bilibili.com/95256449/

    Redis-key:基本命令

    127.0.0.1:6379> keys *    # 查看当前数据库所有的key
    (empty list or set)
    127.0.0.1:6379> set name zxh    # set一个key-value
    OK
    127.0.0.1:6379> set age 1
    OK
    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379> exists name        # 判断key是否存在
    (integer) 1
    127.0.0.1:6379> exists name1
    (integer) 0
    127.0.0.1:6379> move name 1        # 移除key,1表示第0个数据库,从小到大
    (integer) 1
    127.0.0.1:6379> keys *
    1) "age"
    127.0.0.1:6379> get age        # 根据key获取值
    "1"
    127.0.0.1:6379> set name zxh
    OK
    127.0.0.1:6379> expire name 10    # 设置key的过期时间
    (integer) 1
    127.0.0.1:6379> ttl name    # 查看当前key的剩余时间
    (integer) 7
    127.0.0.1:6379> ttl name
    (integer) 6
    127.0.0.1:6379> ttl name
    (integer) 5
    127.0.0.1:6379> ttl name
    (integer) 5
    127.0.0.1:6379> ttl name
    (integer) 1
    127.0.0.1:6379> ttl name
    (integer) -2
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> keys *
    1) "age"
    127.0.0.1:6379> type age    # 查看当前key的类型
    string

    后面如果遇到不会的命令,可以在官网查看帮助文档!

    String(字符串)

    关于字符串的常用命令

    追加、判断是否存在、获取长度

    • set key value:设置值

    • get key value:获取值

    • keys *:获取所以的key

    • append key value:追加字符串,如果当前key不存在,就相当于set一个key

    • strlen key:获取字符串的长度

    • exists key:判断某一个key是否存在

    127.0.0.1:6379> set k1 v1    # 设置值
    OK
    127.0.0.1:6379> get k1    # 获取值
    "v1"
    127.0.0.1:6379> keys *    # 获取所以的key
    1) "k1"
    127.0.0.1:6379> exists k1    # 判断某一个key是否存在
    (integer) 1
    127.0.0.1:6379> APPEND k1 hello    # 追加字符串,如果当前key不存在,就相当于set一个key
    (integer) 7
    127.0.0.1:6379> keys *
    1) "k1"
    127.0.0.1:6379> append k2 zxh    # 不存在则创建
    (integer) 3
    127.0.0.1:6379> keys *
    1) "k2"
    2) "k1"
    127.0.0.1:6379> get k1
    "v1hello"
    127.0.0.1:6379> strlen k1    # 获取字符串的长度
    (integer) 7
    127.0.0.1:6379> append k1 ",zxh"
    (integer) 11
    127.0.0.1:6379> strlen k1
    (integer) 11
    127.0.0.1:6379> get k1
    "v1hello,zxh"

    字符串类型为整数的增/减量

    可以用作浏览量等等

    • incr key:自增 +1

    • decr key:自减 -1

    • incrby key increment:设置步长,指定增量!

    • decrby key decrement:设置步长,指定减量!

    127.0.0.1:6379> set views 0
    OK
    127.0.0.1:6379> get views
    "0"
    127.0.0.1:6379> incr views    # 自增 +1
    (integer) 1
    127.0.0.1:6379> get vies
    (nil)
    127.0.0.1:6379> get views
    "1"
    127.0.0.1:6379> decr views    # 自减 -1
    (integer) 0
    127.0.0.1:6379> decr views
    (integer) -1
    127.0.0.1:6379> get views
    "-1"
    127.0.0.1:6379> incrby views 10    # 设置步长,指定增量!
    (integer) 9
    127.0.0.1:6379> decrby views 5    # 设置步长,指定减量!
    (integer) 4
    127.0.0.1:6379> set name zxh
    OK
    127.0.0.1:6379> incr name    # 如果不是一个整数的字符串,就会报错
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> set age 1.1
    OK
    127.0.0.1:6379> incr age    # 如果不是一个整数的字符串,就会报错
    (error) ERR value is not an integer or out of range

    截取和替换

    • getrange key start end:字符串截取,比如 [0,5] 左右都是一个闭区间

    • setrange key offset value:字符串的替换,替换指定下标的字符

    127.0.0.1:6379> set title hello,zxh
    OK
    127.0.0.1:6379> get title
    "hello,zxh"
    127.0.0.1:6379> getrange title 0 5    # 字符串截取 [0,5]是一个闭区间
    "hello,"
    127.0.0.1:6379> getrange title 0 -1
    "hello,zxh"
    127.0.0.1:6379> setrange title 5 |    # 字符串的替换,替换指定下标的字符
    (integer) 9
    127.0.0.1:6379> get title
    "hello|zxh"

    设置时间、判断是否存在

    • setex key seconds value:设置过期时间

    • ttl key:查看剩余时间

    • setnx key value:判断是否存在,再创建

    127.0.0.1:6379> setex name 10 zxh    # 设置过期时间
    OK
    127.0.0.1:6379> ttl name
    (integer) 9
    127.0.0.1:6379> ttl name    # 查看剩余时间
    (integer) -2
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> setnx db redis    # 判断是否存在,再创建
    (integer) 1
    127.0.0.1:6379> get db
    "redis"
    127.0.0.1:6379> setnx db mongodb
    (integer) 0
    127.0.0.1:6379> get db
    "redis"

    多个值的set 和 获取get 以及 对象存储

    • mset [key value...]:同时设置多个k-v

    • mget [key ...]:同时获取多个k-v

    • msetnx [key value....]:设置多个k-v,msetnx是一个原子操作,要么一起成功,要么一起失败,用于分布式锁

    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3    # 同时设置多个k-v
    OK
    127.0.0.1:6379> keys *
    1) "k2"
    2) "k1"
    3) "k3"
    127.0.0.1:6379> mget k1 k2 k3    # 同时获取多个k-v
    1) "v1"
    2) "v2"
    3) "v3"
    127.0.0.1:6379> msetnx k1 v100 k4 v4    # msetnx是一个原子操作,要么一起成功,要么一起失败,用于分布式锁
    (integer) 0
    127.0.0.1:6379> keys *
    1) "k2"
    2) "k1"
    3) "k3"

    可以使用 user:1:name 这种key方式来表示 user1对象的name属性,用来代替json字符串

    127.0.0.1:6379> mset user:1:name zxh user:1:age 20
    OK
    127.0.0.1:6379> keys *
    1) "user:1:age"
    2) "user:1:name"
    127.0.0.1:6379> get user
    (nil)
    127.0.0.1:6379> get user:1
    (nil)
    127.0.0.1:6379> mget user:1:name user:1:age
    1) "zxh"
    2) "20"

    先获取后设置

    • getset key value:先获取之前存放的值,再设置,如果存在就是覆盖

    127.0.0.1:6379> getset db redis    # 先获取之前存放的值,再设置,如果存在就是覆盖
    (nil)
    127.0.0.1:6379> getset db mongodb    # 先获取之前存放的值,再设置,如果存在就是覆盖
    "redis"
    127.0.0.1:6379> get db
    "mongodb"

    数据结构是相同的!

    String类似的使用场景:value除了是我们的字符串还可以是我们的数字!

    • 计数器

    • 统计多单位的数量

    • 粉丝数

    • 对象缓存存储!

    List(列表)

    Redis中的List类型,可以玩成栈、队列、阻塞队列!

    List类型

    • 左右两边都可以放入数据,如同双端队列

    • 放入的顺序为1234,存放的顺序就是4321,和栈相同,后放入的在最上面

    所有的list命令基本都是 l/L开头的

    创建、获取、弹出

    • lpush key value [value...]:将一个或多个值,插入到列表的头部(也就是左边)

    • lrange key start end:取list中的值!先进后出,后进先出,可以看出一条水平线,从左端依次塞入,做左端依次拿出

    • rpush key value [value...]:从将一个或多个值,从列表的右端放入

    • lpop key:移除列表的第一元素,从左端移除

    • rpop key:移除列表的最后一个元素,从右端移除

    127.0.0.1:6379> lpush list one    # 将一个或多个值,插入到列表的头部(也就是左边)
    (integer) 1
    127.0.0.1:6379> lpush list two
    (integer) 2
    127.0.0.1:6379> lpush list three
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1    # 获取list中的值!先进后出,后进先出,可以看出一条水平线,从左端依次塞入,做左端依次拿出
    1) "three"
    2) "two"
    3) "one"
    127.0.0.1:6379> lrange list 0 1    # 获取下标区间内的值,[0, 1]左右都是闭合的
    1) "three"
    2) "two"
    127.0.0.1:6379> rpush list four    # 
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    4) "four"
    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    4) "four"
    127.0.0.1:6379> lpop list    # 移除列表的第一元素,从左端移除
    "three"
    127.0.0.1:6379> rpop list    # 移除列表的最后一个元素,从右端移除
    "four"
    127.0.0.1:6379> lrange list 0 -1
    1) "two"
    2) "one"

    根据下标获取、获取长度

    • lindex key index:通过下标获取列表的值

    • llen key:获取列表的长度/大小

    127.0.0.1:6379> lrange list 0 -1
    1) "two"
    2) "one"
    127.0.0.1:6379> lindex list 1    # 通过下标获取列表的值
    "one"
    127.0.0.1:6379> lindex list 0
    "two"
    127.0.0.1:6379> llen list
    (integer) 2

    移除指定的value并且可以指定个数

    • lrem key count value:移除列表中指定个数的指定的值,精准匹配

    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "three"
    3) "two"
    4) "one"
    127.0.0.1:6379> lrem list 1 one    # 移除列表中指定个数的指定的值,精准匹配
    (integer) 1
    127.0.0.1:6379> lrange list 0 -1
    1) "three"
    2) "three"
    3) "two"
    127.0.0.1:6379> lrem list 2 three
    (integer) 2
    127.0.0.1:6379> lrange list 0 -1
    1) "two"

    截取列表并替换

    • ltrim key start end:通过下标指定长度,截取列表的值,并且用截取的列表改变原列表

    127.0.0.1:6379> rpush mylist hello1 hello2 hello3 hello4
    (integer) 4
    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello1"
    2) "hello2"
    3) "hello3"
    4) "hello4"
    127.0.0.1:6379> ltrim mylist 1 2    # 通过下标指定长度,截取列表的值,并且用截取的列表改变原列表
    OK
    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello2"
    2) "hello3"

    弹出最后一个元素到另一个列表

    • rpoplpush resouce destination:移除原列表最后一个元素,将它移动到新的列表中(做左端放入)

    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello2"
    2) "hello3"
    3) "hello1"
    4) "hello4"
    127.0.0.1:6379> rpoplpush mylist newlist
    "hello4"
    127.0.0.1:6379> lrange mylist 0 -1
    1) "hello2"
    2) "hello3"
    3) "hello1"
    127.0.0.1:6379> lrange newlist 0 -1
    1) "hello4"

    替换、插入

    • lset key index value:替换列表中指定下标的值

    • linsert key before|after pivot value:在指定的值前面或者后面插入值

    127.0.0.1:6379> exists list
    (integer) 0
    127.0.0.1:6379> lset list 0 one
    (error) ERR no such key
    127.0.0.1:6379> lpush list one
    (integer) 1
    127.0.0.1:6379> lrange list 0 -1
    1) "one"
    127.0.0.1:6379> lset list 0 two        # 替换列表中指定下标的值
    OK
    127.0.0.1:6379> lset list 1 three    # 如果没有对应的列表,则会报错!
    (error) ERR index out of range    
    127.0.0.1:6379> lrange list 0 -1
    1) "one"
    127.0.0.1:6379> lset list 0 two    
    OK
    127.0.0.1:6379> lset list 1 three    # 如果没有对应的元素,则会报错!
    (error) ERR index out of range
    ########################################
    127.0.0.1:6379> lrange list 0 -1
    1) "two"
    127.0.0.1:6379> lpush list one
    (integer) 2
    127.0.0.1:6379> rpush list three
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1
    1) "one"
    2) "two"
    3) "three"
    127.0.0.1:6379> linsert list before three four    # 在指定的three值前面插入值
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "one"
    2) "two"
    3) "four"
    4) "three"
    127.0.0.1:6379> linsert list after one five    # 在指定的one值后面插入值
    (integer) 5
    127.0.0.1:6379> lrange list 0 -1
    1) "one"
    2) "five"
    3) "two"
    4) "four"
    5) "three"

    小结

    • 他实际上是一个链表,before Node after , left,right 都可以插入值

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

    • 如果key存在,新增内容

    • 如果移除了所有值,空链表,也代表不存在!

    • 在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~

    消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

    Set(集合)

    set中的值是不能重复的!

    • sadd key meber [member...]:在set集合中添加元素

    • smembers key:查看指定set集合的所有值

    • sismember key member:判断某一个值是否在集合中

    • scard key:获取指定set集合的大小

    • srem key member [member...]:移除set集合中指定的一个或多个元素

    • srandmember key count:随机获取set集合中的一个或者多个元素

    • spop key cout:随机删除一个或者多个元素

    • smove resouce destination member:将集合中指定的元素移动到另一个集合中

    • sdiff key [key...]:差集,保留在第一个集合中其他集合里没有的值

    • sinter key [key...]:交集

    • sunion key [key...]:并集

    ################## 添加、查看所有、判断是否存在 ######################
    127.0.0.1:6379> sadd set hello zxh world    # 在set集合中添加元素
    (integer) 3
    127.0.0.1:6379> smembers set    # 查看指定set集合的所有值
    1) "zxh"
    2) "hello"
    3) "world"
    127.0.0.1:6379> sismember set zxh    # 判断某一个值是否在集合中
    (integer) 1
    127.0.0.1:6379> sismember set hello    
    (integer) 1
    
    ################## 获取个数 ######################
    127.0.0.1:6379> scard set    # 获取指定set集合的大小
    (integer) 3
    
    ################## 移除指定的元素 ######################
    127.0.0.1:6379> srem set hello    # 移除set集合中指定的一个或多个元素
    (integer) 1
    127.0.0.1:6379> scard set
    (integer) 2
    127.0.0.1:6379> smembers set
    1) "zxh"
    2) "world"
    
    ################## 随机获取set集合的元素 ######################
    127.0.0.1:6379> sadd set zxh hello world 23333
    (integer) 4
    127.0.0.1:6379> smembers set
    1) "23333"
    2) "zxh"
    3) "hello"
    4) "world"
    127.0.0.1:6379> srangemember set    # 随机获取set集合的一个元素
    (error) ERR unknown command `srangemember`, with args beginning with: `set`, 
    127.0.0.1:6379> srandmember set
    "hello"
    127.0.0.1:6379> srandmember set
    "hello"
    127.0.0.1:6379> srandmember set
    "world"
    127.0.0.1:6379> srandmember set 2    # 随机获取set集合的2个元素
    1) "zxh"
    2) "23333"
    127.0.0.1:6379> srandmember set 2
    1) "23333"
    2) "world"
    
    
    ################## 随机删除元素 ######################
    127.0.0.1:6379> spop set    # 随机删除set集合中一个或者多个元素
    "hello"
    127.0.0.1:6379> spop set
    "23333"
    127.0.0.1:6379> smembers set
    1) "zxh"
    2) "world"
    
    ################## 将指定值移动到另一个集合中 ######################
    127.0.0.1:6379> sadd set1 hello world zxh        
    (integer) 3
    127.0.0.1:6379> sadd set2 2333
    (integer) 1
    127.0.0.1:6379> smove set1 set2 zxh    # 将集合中的指定值移动到另一个集合中
    (integer) 1
    127.0.0.1:6379> smembers set1
    1) "hello"
    2) "world"
    127.0.0.1:6379> smembers set2
    1) "zxh"
    2) "2333"
    
    ################## 并集、交集、差集 ######################
    127.0.0.1:6379> sadd set1 a b c
    (integer) 3
    127.0.0.1:6379> sadd set2 b c d e
    (integer) 4
    127.0.0.1:6379> sdiff set2 set1    # 差集,set2 - set1 保留set2中set1没有的植
    1) "e"
    2) "d"
    127.0.0.1:6379> sinter set1 set2    # 交集
    1) "c"
    2) "b"
    127.0.0.1:6379> sunion set1 set2    # 并集
    1) "a"
    2) "e"
    3) "c"
    4) "b"
    5) "d"

    小结

    • 可以应用在共同关注,共同爱好

      • 这里的好友概念,有一个理论叫:六度分割理论!

    • 随机抽奖

    Hash(哈希集合)

    hash类型:相当于map集合,原来存储的是 key-value,现在变成 key-map!本质和String类型没有太大区别,还是一个简单的k-v!

    • hset key field value:存放一个具体的 k-v

    • hget key field:获取key中某一个属性值

    • hmset key field value [field value...]:存放一个或多个 k-v

    • hmget key field [field....]:获取key中一个或多个属性值

    • hdel key field [field...]:删除key中一个或多个属性值

    • hgetall key:获取key的全部的数据,以键值对形式显示

    • hlen key:获取map的长度

    • hexists key field:判断map是否有对应的属性

    • hkeys key:获取map所有的key

    • hvals key:获取map所有的value

    • hincrby key field increment:对map中的整数类型进行增量

    • hsetnx key field value:判断map中是否有对应的属性,如果没有进行存储

    ################## 存储、获取、获取所有、指定删除 ######################
    127.0.0.1:6379> hset hash field1 zxh    # 存放一个具体的 k-v
    (integer) 1
    127.0.0.1:6379> hget hash field1    # 获取key中某一个属性值
    "zxh"
    127.0.0.1:6379> hmset hash field1 zxh field2 10    # 存放多个 k-v
    OK
    127.0.0.1:6379> hmget hash field1 field2    # 获取key中多个属性值
    1) "zxh"
    2) "10"
    127.0.0.1:6379> hdel hash field1    # 删除key中指定的属性值
    (integer) 1
    127.0.0.1:6379> hgetall hash    # 获取key的全部的数据,以键值对形式显示
    1) "field2"
    2) "10"
    
    ################## 获取长度 ######################
    127.0.0.1:6379> hmset hash field1 hello field2 world
    OK
    127.0.0.1:6379> hgetall hash
    1) "field1"
    2) "hello"
    3) "field2"
    4) "world"
    127.0.0.1:6379> hlen hash    # 获取map的长度
    (integer) 2
    
    ################## 判断map中是否存在 ######################
    127.0.0.1:6379> hgetall hash
    1) "field1"
    2) "hello"
    3) "field2"
    4) "world"
    127.0.0.1:6379> hexists hash field1    # 判断map中是否存在指定的属性
    (integer) 1
    127.0.0.1:6379> hexists hash field3
    (integer) 0
    
    ################## 获取所有的key、获取所有的value ######################
    127.0.0.1:6379> hkeys hash    # 获取map中所有的key
    1) "field1"
    2) "field2"
    127.0.0.1:6379> hvals hash    # 获取map中所有的value
    1) "hello"
    2) "world"
    
    ################## 增量 ######################
    127.0.0.1:6379> hset myhash field 5
    (integer) 1
    127.0.0.1:6379> hincrby myhash field 3    # 进行按步长增量
    (integer) 8
    127.0.0.1:6379> hincrby myhash field -3
    (integer) 5
    
    ################## 判断后再存储 ######################
    127.0.0.1:6379> hsetnx myhash field2 hello    # 判断是否有对应的属性,如果没有进行存储
    (integer) 1
    127.0.0.1:6379> hsetnx myhash field2 world    # 判断是否有对应的属性,如果有不进行存储
    (integer) 0
    
    ################# 对象存储 ##########################
    127.0.0.1:6379> hset hash user1:name zxh
    (integer) 1
    127.0.0.1:6379> hset hash user2:age 1
    (integer) 1
    127.0.0.1:6379> hmget hash user1:name user2:age
    1) "zxh"
    2) "1"

    小结

    hash主要用于存储用户信息之类的,经常变动的信息!hash更适合对象的存储,String类型更适合字符串存储!

    Zset(有序集合)

    Zset就是在set集合上,增加了一个值,比如:set k1 v1,现在是zset k1 score1 v1

    我们就可以针对score1 这个值进行一些操作:比如排序

    • zadd key score member [score member...]:添加一个或者多个元素

    • zrange key start end [withscores]:指定区间获取set集合的元素,可以设置是否显示score字段

    • zrangebyscore key min max [withscores]:根据指定的score进行升序排列

    • zrevrange key start stop [withscores]:根据指定的score进行降序排列

    • zrem key member [member...]:删除一个或者多个元素

    • zcard key:获取set集合的长度/大小

    • zcount salary min max:统计个数,按照score属性的区间进行,在[min,max]之间的个数

    ################### 添加、获取 #######################
    127.0.0.1:6379> zadd set 1 one 2 two 3 three    # 添加一个或者多个元素
    (integer) 3
    127.0.0.1:6379> zrange set 0 -1    # 指定区间获取set集合的元素
    1) "one"
    2) "two"
    3) "three"
    127.0.0.1:6379> zrange set 0 -1 withscores    # 指定区间获取set集合的元素,包含score字段
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    
    ################### 排序(升序和降序) #######################
    127.0.0.1:6379> zadd salary 2500 xiaohong
    (integer) 1
    127.0.0.1:6379> zadd salary 5000 zhangsan
    (integer) 1
    127.0.0.1:6379> zadd salary 500 zxh
    (integer) 1
    # 根据指定的score进行升序排列,+-inf表示正无穷大和负无穷大
    127.0.0.1:6379> zrangebyscore salary -inf +inf
    1) "zxh"
    2) "xiaohong"
    3) "zhangsan"
    127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
    1) "zxh"
    2) "500"
    3) "xiaohong"
    4) "2500"
    5) "zhangsan"
    6) "5000"
    # 根据指定的score进行降序排列
    127.0.0.1:6379> zrevrange salary 0 -1
    1) "zhangsan"
    2) "xiaohong"
    3) "zxh"
    # 显示工资小于2500的人并按升序排列
    127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores
    1) "zxh"
    2) "500"
    3) "xiaohong"
    4) "2500"
    
    ################### 删除、长度 #######################
    127.0.0.1:6379> zrange salary 0 -1
    1) "zxh"
    2) "xiaohong"
    3) "zhangsan"
    127.0.0.1:6379> zrem salary xiaohong
    (integer) 1
    127.0.0.1:6379> zrange salary 0 -1
    1) "zxh"
    2) "zhangsan"
    127.0.0.1:6379> zcard salary
    (integer) 2
    
    ################### 按score统计 #######################
    127.0.0.1:6379> zrange salary 0 -1
    1) "zxh"
    2) "zhangsan"
    127.0.0.1:6379> zadd salary 2500 xiaohong
    (integer) 1
    127.0.0.1:6379> zrange salary 0 -1
    1) "zxh"
    2) "xiaohong"
    3) "zhangsan"
    127.0.0.1:6379> zcount salary 0 2500    # 统计区间内的元素个数
    (integer) 2
    127.0.0.1:6379> zcount salary 0 5000
    (integer) 3

    其他的API参考官网,工作中有用到可以去查看!

    小结

    • 既然时有序的,可以对班级的成绩,工资表进行排序!

    • 比如b站的排行榜,统计视频的播放量,放到Zset进行排序,每天进行操作即可!

    • 普通消息是1,重要的消息是2,可以进行带权重进行判断!

    致力于记录学习过程中的笔记,希望大家有所帮助(*^▽^*)!
  • 相关阅读:
    ENVI数据格式
    旋转卡壳模板
    旋转卡壳求两个凸包最近距离poj3608
    树状数组模板
    输入输出挂
    Catalan数以及使用Raney引理证明
    【转】AC神组合数取模大全
    单向HASH——MurmurHash
    hdu4063(圆与圆交+线段与圆交+最短路)
    字符串HASH模板
  • 原文地址:https://www.cnblogs.com/zxhbk/p/13052418.html
Copyright © 2011-2022 走看看