为了账号安全,请及时绑定邮箱和手机立即绑定

Redis入门一(数据结构和API)

标签:
Redis

特点

  • 数据结构
    • key-value
      • Java Map : String value = map.get(“key”)
      • Python Dict : dictionary[“key “] value
      • PHP Array:[‘key’ => ‘value’]
      • ……
    • 其他
      • BitMaps 位图 布隆过滤器
      • HyperLoglog 超小内存唯一值计数
      • GEO 地理信息定位
        图片描述
  • 速度快
    • 10w OPS 即operation per second 每秒操作次数。意味着每秒对Redis的持久化操作
    • 数据存储在内存
  • 图片描述
  • 图片描述
  • C语言编写
  • 单线程
  • 持久化
    • 内存(数据) -> 异步 硬盘 RDB AOF
    • 高可用 Redis-Sentinel(v2.8)
    • 分布式 Redis-Cluster(v3.0)
  • 主从复制
    • 高可用分布式
  • 功能丰富
    • 发布订阅
    • 事务
    • Lua脚本
    • pipeline
  • simple
    • 23000 lines of core code
    • 不依赖外部库(like libevent)
    • 单线程模型

典型应用场景

  • 缓存系统
  • 计数器
  • 消息队列系统 发布订阅
  • 排行榜
  • 社交网络
  • 实时系统
  • 布隆过滤器

安装

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make && make install 
  • redis-server
    • Redis服务器
  • redis-cli
    • Redis命令行客户端
  • redis-benchmark
    • 性能测试
  • redis-check-aof
    • AOF文件修复工具
  • redis-check-dump
    • RDB文件检查工具
  • redis-sentine
    • sentinel服务器(2.8以后)

启动方式

$ cd src
# 最简启动
$ ./redis-server
# 动态参数启动
redis-server --port 6379
# 配置文件启动
redis-server 配置文件
# 验证方式
ps -ef | grep redis
netstat -antpl |grep redis
redis-cli -h ip -p port ping
  • 生成环境选择配置启动
  • 单机多实例配置文件可以用端口区分开

客户端连接

[@zw-34-55~]#redis-cli-h 10.10.79.150-p 6384
10.10.79.150:6384>ping
PONG
10.10.79.150:6384>set hello world
OK
10.10.79.150:6384>get hello
hello
  • 状态回复
    • ping
  • 错误回复
  • 整数回复
    • incr
  • 字符串回复
    • get
  • 多行字符串回复
    • mget

命令配置

  • daemonize
    • 是否是守护进程(nolyes)
  • port
    • Redis对外端口号
  • logfile
    • Redis系统日志
  • dir
    • Redis工作目录

通用命令

  • key

  • keys*

    • 遍历所有key
    • keys命令一般不再生产环境使用.过重,o(n)
    • 图片描述
  • 热备从节点

  • scan 用于迭代当前数据库中的数据库键

  • del key [key…]

    • 删除指定key-value
    • 时间复杂度 O(1)图片描述
  • dbsize

    • 计算key的总数
    • 时间复杂度 O(1)图片描述
  • expire key seconds

    • key在seconds秒后过期
    • 时间复杂度 O(1)
  • exists key

    • 检查key是否存在
    • 时间复杂度 O(1)图片描述
  • type key

    • 返回key的类型 string,hash,list,set,zset,none
    • 时间复杂度 O(1)
      图片描述
  • ttl key

    • 查看key剩余的过期时间
  • persist key

    • 去掉key的过期时间
      图片描述
      图片描述

数据结构和内部编码

图片描述
图片描述

单线程为什么这么快?

  • 1.纯内存
  • 2.非阻塞IO
  • 3.避免线程切换和竞态消耗
    图片描述
  • 1.一次只运行一条命令
  • 2.拒绝长(慢)命令
    • keys,flushall,flushdb,slow lua script,mutil/exec,operate ,big value(collection)
  • 3.其实不是单线程
    • fysnc file descriptor
    • close file descriptor

API们

字符串

  • 场景
    • 缓存
    • 分布式锁
    • 计数器
      字符串键值结构
      图片描述
  • get key
    • 获取key对应的value
    • 时间复杂度 O(1)
  • set key value
    • 设置key-value
    • 时间复杂度 O(1)
  • del key
    • 删除key-value
    • 时间复杂度 O(1)
  • incr key
    • key自增1,如果key不存在,自增后get(key)=1
    • 时间复杂度 O(1)
  • decr key
    • key自减1,如果key不存在,自减后get(key)=-1
    • 时间复杂度 O(1)
  • incrby key k
    • key自增k,如果key不存在,自增后get(key)=k
    • 时间复杂度 O(1)
  • decr key k
    • key自减k,如果key不存在,自减后get(key)=-k
    • 时间复杂度 O(1)
      图片描述
  • set key value
    • 不管key是否存在,都设置
    • 时间复杂度 O(1)
  • setnx key value
    • key不存在,才设置
    • 时间复杂度 O(1)
  • set key value xx
    • key存在,才设置
    • 时间复杂度 O(1)
  • mget keyl key2 key3…
    • 批量获取key,原子操作
    • 时间复杂度 O(n)
  • mset key1 valuel key2 value2 key3 value3
  • 批量设置key-value
  • 时间复杂度 O(n)
    图片描述
  • getset key newvalue
    • set key newvalue并返回旧的value
    • 时间复杂度 O(1)
  • append key value
    • 将value追加到旧的value
    • 时间复杂度 O(1)
  • strlen key
    • 返回字符串的长度(注意中文)
    • 时间复杂度 O(1)
  • incrbyfloat key 3.5
    • 增加key的value值3.5
    • 时间复杂度 O(1)
  • getrange key start end
    • 获取字符串指定下标所有的值
    • 时间复杂度 O(1)
  • setrange key index value
    • 设置指定下标所有对应的值
    • 时间复杂度 O(1)
      图片描述

HASH

图片描述

  • 时间复杂度O(1)
  • hget key field
    • 获取hash key对应的field的value
  • hset key field value
    • 设置hash key对应field的value
  • hdel key field
    • 删除hash key对应field的value
  • hexists key field
    • 判断hash key是否有field
  • 时间复杂度O(n)
  • hmget key field1 field2…fieldN
    • 批量获取hash key的一批field对应的值
  • hmset key field 1 valuel field2 value2…fieldN valueN
    • 批量设置hash key的一批field value
      图片描述
  • 时间复杂度O(n)
  • hgetall key
    • 返回hash key对应所有的field和value
  • hvals key
    • 返回hash key对应所有field的value
  • hkeys key
    • 返回hash key对应所有field
  • 时间复杂度O(1)
  • hsetnx key field value
    • 设置hash key对应field的value(如field已经存在,则失败)
  • hincrby key field intCounter
    • hash key对应的field的value自增intCounter
  • hincrbyfloat key field floatCounter
    • hincrby浮点数版
      图片描述

string和hash对比

图片描述
图片描述

lists 列表

图片描述
图片描述

Set 集合

  • 无序
  • 无重复
  • 集合间操作
  • smembers 无序,小心使用(数据过大时)

  • 时间复杂度 O(1)
  • sadd key element
    • 向集合key添加element(如果element已经存在,添加失败)
  • srem key element
    • 将集合key中的element移除掉
      图片描述
      图片描述
      图片描述

集合间操作

图片描述

  • SADD=Tagging
  • SPOP/SRANDMEMBER=Random item
  • SADD+SINTER =Social Graph
    图片描述

zset 有序集合

  • 无重复元素
  • 列表 -> 可以有重复元素

  • zadd key score element(可以是多对)
    • 添加score和element
    • O(logN)
      图片描述
  • zrem key element(可以是多个)
    • 删除元素
    • O(1)

图片描述

  • zscore key element
    • 返回元素的分数
    • O(1)
  • zincrby key increScore element
    • 增加或减少元素的分数
    • O(1)
  • zcard key
    • 返回元素的总个数
    • O(1)
  • zrange key start end [WITHSCORES]
    • 返回指定索引范围内的升序元素[分值]
    • O(log(n)+m)
  • zrangebyscore key minScore maxScore [WITHSCORES]
    • 返回指定分数范围内的升序元素[分值]
    • O(log(n)+m)
  • zcount key minScore maxScore
    • 返回有序集合内在指定分数范围内的个数
    • O(log(n)+m)
  • zremrangebyrank key start end
    • 删除指定排名内的升序元素
    • O(log(n)+m)
  • zremrangebyscore key minScore maxScore
    • 删除指定分数内的升序元素
    • O(log(n)+m)
      图片描述
      图片描述
      图片描述
      图片描述

Jedis And redis-py

图片描述
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
1.6万
获赞与收藏
1807

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消