Redis是什么

  • Redis(Remote Dictionary Server):远程字典服务
  • 是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-Value数据库,提供有多种语言的API
  • 当下最热门的NoSQL技术之一,也被人们称之为结构化数据库

Redis能干什么

  • 内存存储、持久化(内存中是断电即失,所以持久化很重要)
  • 效率高,可以用于高速缓存
  • 发布订阅系统
  • 地图信息分析
  • 计时器、计数器、浏览量

Redis的特性

  • 多样的数据类型
  • 可以持久化
  • 事务功能
  • 可以做集群

Windows下安装

  1. 下载
  2. 解压到自己的环境目录
  3. 在环境目录中运行:redis-server.exe redis.windows.conf
  4. 进入redis-cli.exe,输入ping,测试连接

Linux下安装

  1. 下载压缩包:wget http://download.redis.io/releases/redis-5.0.8.tar.gz
  2. 解压到opt路径下:tar -zxvf redis-5.0.8.tar.gz
  3. 安装gcc:yum install gcc-c++
  4. cd /redis-5.0.8 —> make
  5. make install
  6. linux会默认安装到 /usr/local/bin

Linux下Redis配置

  1. /usr/local/bin下创建用于保存自己的配置文件的目录:mkdir myconfig
  2. 将Redis的配置文件拷贝过来:cp /opt/redis-5.0.8/redis.conf myconfig
  3. 文件中monize no改为monize yes,从而以后台方式启动

Linux下启动Redis

  • /usr/local/bin下执行:redis-server myconfig/redis.conf 启动Redis
  • /usr/local/bin下执行:redis-cli -h host -p port -a password 进入Redis客户端
  • 客户端执行shutdown然后exit 关闭Redis并退出客户端

Redis benchmark

官方自带的性能测试工具

  • 测试:100个并发连接 100000请求

    /usr/local/bin下执行:redis-benchmark -h localhost -p 6379 -c 100 -n 100000

Redis基本命令

以下命令都是在Redis客户端下执行的

  • Redis默认有16个数据库,0-15号,默认使用的是第0号

    select n(select 3)命令:进行数据库的切换

  • dbsize命令:查看当前数据库大小

  • keys *命令:查看当前数据库所有的key

  • set key_name key_value:向当前数据库增加一个key

  • flushdb命令:清空当前数据库

  • flushall:清空全部数据库

  • exists key_name:若key存在,返回1,否则返回0

  • mave key_name:移除目标key

  • expire key_name num(阿拉伯数字):为目标key设置过期时间

  • ttl key_name:查看目标key剩余时间

  • type key_name:查看目标key的类型

Redis数据类型

五大基本数据类型

  • String

    使用场景:String类型的value除了字符串还可以是数字;故可以用于实现计数器、统计单位的数量、对象缓存、网页缓存

    常用命令:

    • append key_name value:向目标key后追加内容,若key不存在,就相当于新增了一个key
    • strlen key_name:查看目标key所对应值的长度
    • incr key_name:目标key值+1,可以用于实现网站的实时数据,如阅读量(key值为数字时,Redis后台会自动转换为Integer后再操作)
    • decr key_name:目标key值-1
    • incrby/decrby key_name num(阿拉伯数字):增/减指定数值
    • getrange key_name num1 num2:获取字符串区间
    • setrange key_name num xx:从num起修改字符串的值为xx
    • mset k1 v1 k2 v2 k3 v3:一次设置多个key
    • mget k1 k2 k3:一次获取多个value
      • mset、mget是原子性操作,要么全部成功,否则失败
    • setex key_name num key_value:创建目标key,同时设置过期时间
    • setnx key_name key_value:不存在此key的情况下,再创建目标key
    • set user:1 {name:waston,age:3}:设置一个user:1对象 值为json字符串
    • set item:{id}:value:如set book:3:views,3号书的浏览量
    • getset key_name value:先get目标key,再向目标key设置value值
    • lset list_name index value:向目标list的指定下标放值,该list与下标必须存在!
  • List

    Redis里,list底层数据结构是链表,可以作为栈、队列、阻塞队列使用

    使用场景:消息队列

    常用命令:

    list_name在Redis中还是以key的形式储存

    • lpush list_name value:向目标list左边(头部)添加value
    • rpush list_name value:向目标list右边(尾部)添加value
    • lrange list_name num1 num2:查看目标list里的值;lrange list_name 0 -1:查看全部
    • lpop list_name:目标list在左边(头部)弹出一个值
    • rpop list_name:目标list在右边(尾部)弹出一个值
    • lindex list_name num(从0开始):获取目标list左数第num+1个值
    • llen list_name:获取list长度
    • lrem list_name value:移除目标list中的全部value
    • lrem list_name num value:移除目标list中num个value,从左往右
    • ltrim list_name num1 num2:截取目标list;保留num1到num2这部分的值
    • rpoplpush a_list b_list:从a_list右边弹出一个值,并放到b_list中
    • linsert list_name before/after value1 value2:向目标list中value1左/右添加value2
  • Set

    Set中的值不能重复

    使用场景:用户间共同关注、共同爱好等共同属性的展示;好友推荐

    常用命令:

    • sadd set_name value:向目标set添加一个元素
    • smembers set_name:查看目标set中的元素
    • sismember set_name value:判断value是否在目标set中(1:存在 0:不存在)
    • scard set_name:目标set中的元素个数
    • srem set_name value:移除目标set中的value元素
    • srandmember set_name (num):从目标set中随机取出一个(num个)元素
    • spop set_name:从目标set中随机弹出一个元素
    • smove set1 set2 value:将set1中的value移动到set2
    • sdiff set1 set2:返回set1中有但set2没有的元素
    • sinter set1 set2:返回set1与set2中共同拥有的元素
    • sunion set1 set2:返回set1与set2中所有的元素,相同元素只返回一个
  • Hash

    Map集合,key-map;本质和String类型没有太大区别,string中的value变成了key-value

    hash更适合对象的存储,string更适合一般字符串的存储

    使用场景:用一个hash储存一个用户一系列的信息

    常用命令:

    • hset hash_name key_name value:创建一个hash
    • hget hash_name key_name:获取目标hash中目标key对应的value
    • hmset hash_name k1 v1 k2 v2:创建多个值
    • hmget hash_name k1 k2 :获取多个值
    • hdel hash_name key_name:删除目标hash中的目标key及对应的value
    • hlen hash_name:查看目标hash中有多少个key
    • hexists hash_name key_name:判断目标hash中目标key是否存在
    • hkeys hash_name:查看目标hash中的所有key
    • hvals hash_name:查看目标hash中的所有value
    • hincrby hash_name key_name 1/-1:使目标key的value+1或-1
    • hsetnx hash_name key_name value:目标key不存在时进行创建
  • Zset

    有序集合

    在set的基础上增加了一个值,用于排序

    使用场景:排行榜、数据加权

    常用命令:

    • zadd set_name score value:创建目标zset,并增加一个值score
    • zadd set_name n1 v1 n2 v2:创建多个,eg:zadd salary 100 sam 200 kim
    • zrangebyscore set_name -inf +inf:目标zset按score排序升序输出,范围为-inf至+inf,表示正负无穷即全范围
    • zrevrange set_name +inf -inf:降序输出
    • zrangebyscore set_name -inf +inf withscores:排序输出并附带score
    • zrem set_name value:移除目标zset中的指定元素
    • zcard set_name:获取zset中元素的个数
    • zcount set_name num1 num2:获取num1至num2之间的元素的个数

三种特殊类型

  • geospatial

    地理位置;底层由zset实现

    使用场景:定位、附近的人、距离计算

    常用命令:

    1. 添加地理位置:geoadd key_name longitude(经度) latitude(纬度)place_name (eg:geoadd china:city 116.40 39.90 beijing)

      一般是下载城市地理数据,使用java程序一次性导入

    2. 获取目标底点经纬度数据:geopos key_name place_name1 place_name2(一个或多个)

    3. 返回两地之间的距离:geodist key_name place1 place2 unit

      unit是单位,可以是km m mi ft

    4. 以给定的经纬度为中心,找出某一半径内的元素:georadius key_name longitude(中心经度) latitude(中心纬度)radius(半径) unit(单位) xxx(附加参数)

      附加参数为withdist,结果附加直线距离;withcoord,附加经纬度;count num,限制结果数量

    5. 查询以指定地点为中心,指定范围内的元素:georadiusbymember key_name place_name radius unit

    6. 将指定地点的经纬度以字符串的格式返回:geohash china:city place_name

    7. 移除目标地点:zrem key_name place_name

    8. zset相关命令都可以直接使用…

  • Hyperloglog

    一种用于基数统计的数据结构

    基数,即一个数组去除重复元素后,剩余元素的个数;如{1,3,5,5,7}去重后{1,3,5,7},基数为4

    使用场景:记录网页的UV(一个人访问多次,按一次算)、计数统计

    常用命令:

    1. 创建一个Hyperloglog:pfadd key_name value1 value2 …
    2. 查看指定Hyperloglog内元素数量:pfcount key_name
    3. 合并Hyperloglog(并集):pfmerge key_name key1 key2
  • Bitmap

    位图,可以视为一个数组

    应用场景:只有两种状态下的统计,0表示一种情况,1表示另一种情况。如:登陆、打卡

    常用命令:

    1. 在目标位图目标下标设值:setbit map_name index 0/1
    2. 获取目标位图目标下标的值:getbit map_name index
    3. 统计目标位图中值为1的元素个数:bitcount map_name