Redis概述

Redis是什么?

Redis(==Re==mote ==di==ctionary ==s==erver),即远程字典服务。
是一个开元的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多重语言的API。

Redis能干嘛?

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

特性

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务

安装

  1. 下载,直接官网下载即可
  2. tar -zxvf解压下载的redis-*.tar.gz
  3. make 命令执行安装
  4. make install将redis安装到/usr/local/bin目录下
  5. cp redis.conf /usr/local/bin/doublyConfig,将redis的配置文件拷贝一份,后续使用修改该配置文件。方便出问题复原
  6. vim redis.conf,编辑配置文件,\daemonize搜索daemonize,将值改为yes,表示以后台的方式启动
  7. redis-server doublyConfig/redis.conf,使用修改的配置文件启动redis
  8. redis-cli -h localhost -p 6379,使用redis客户端连接server。-h表示主机,-p表示端口
  9. 客户端连接后,使用ping,返回PONG,表示连接成功;set name doubly设置键值对;get name获取键值对;

基础知识

Redis是单线程的(据说6.0的已经是多线程的了?)

Redis是基于内存操作的,性能瓶颈已经不是CPU了,而是内存和网络带宽。

为什么Redis单线程还这么快?

  1. 多线程不一定就比单线程快,因为多线程要频繁的进行上下文切换,是非常耗时的。
  2. 高性能服务器也不一定是多线程的。
  3. CPU > 内存 > 硬盘,Redis将所有的数据放在内存中。对于内存系统没有上下文切换,在一个CPU上完成。

Redis五大基础类型

  1. String类型
  2. List类型(双向链表)
  3. Set类型(无序不重复集合)
  4. Hash类型(相当于Map):适合对象的存储
  5. Zset类型(有序集合)

三大特殊类型

  1. Geospatial类型(地理位置),基于Zset实现
  2. HyperLogLog类型,基于算法的基数(不重复的元素)统计的数据结构。0.81%的错误率,允许容错的情况下可以使用,只占用12KB的内存,统计效率高。
  3. BitMap类型,位图

基础命令

set name doubly , get name:设置、获取值

exists name:判断是否存在

expire name 10:设置过期时间(秒)

ttl name:查看key剩余时间

move name 1:移动name到数据库1

  • 数据库命令(select,dbsize)

Redis默认有16个数据库

配置文件中的位置

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
127.0.0.1:6379> DBSIZE #查看数据大小
(integer) 5
127.0.0.1:6379> select 1 #切换数据库
OK
127.0.0.1:6379[1]> keys * #查看所有的key
(empty array) 
  • 清除数据库命令

flushdb:清除当前数据库

flushall:清除所有数据库

  • String类型相关命令

    • append name aaa:追加字符串,如果key不存在,则创建key
    • strlen name:返回字符串长度
    • incr views:自增1
    • decr views:自减1
    • incrby views 10:自增步长
    • decrby views 5:自减步长
    • getrange name 3 6:截取字符串
    • setrange name 3 abcd:替换字符串
    • setex name doubly 30:set with expire,设置值并同时设置过期时间
    • setnx name doubly:set not exist,不存在则创建KV,存在则创建失败
    • mset k1 v1 k2 v2 k3 v3mget k1 k2 k3:批量设置获取
    • msetnx k1 v1 k4 v4:setnx的批量操作,原子操作,一个失败就全部失败
    • 设置对象,user:{id}:{field}
      #设置一个对象,redis允许设置user:{id}:{field}格式
      mset user:1:name doubly age 12
      #同时获取对象的name和age
      mget user:1:name age
    • getset name doubly:先获取,再设置。返回当前值,并设置新的值
  • List类型相关命令

    • lpush list v1:在list头部插入新元素,没有则创建
    • rpush list v2:在list尾部(右)插入新元素
    • lrange list 0 -1:获取列表一段范围的元素
    • lpop list [2],rpop list:弹出list左/右侧的元素
    • lindex list 2:查看list某个下标的元素
    • llen list:查询list的长度
    • lrem list 2 value:移除list中2个value
    • ltrim list 1 2:截取list[1-2]
    • rpoplpush list newlist:弹出list最右侧的元素并插入到新的list中,最后返回元素
    • lset list 0 newitem:更新list某个下标的元素,如果key不存在则报错,如果下标不存在也报错
    • linsert list before|after value test:在list中的value前|后插入新元素
  • Set类型相关命令

    • sadd myset doubly:向set集合中新增一个元素,可以不存在则新建
    • smembers myset:查看set集合中的所有元素
    • sismember myset doubly:验证set集合中某个元素是否存在
    • scard myset:返回set集合中的元素个数
    • srem myset doubly:移除set集合中的指定元素
    • srandmember myset:获取set集合中的一个随机元素
    • spop myset:从set集合中随机删除一个元素
    • smove myset newset doubly:将元素从一个set集合移动到另一个set集合中
    • sdiff myset newset:获取两个set集合的差集。只获取myset有而newset没有的元素
    • sinter myset newset:获取两个set集合的交集
    • sunion myset newset:获取两个set集合的并集
  • Hash类型相关命令

    • hset,hget:设置获取hash
    • hmset,hmget:批量设置,获取(hset,hget也可以批量,4.0以后官方启用hmset,hmget?)
    • hgetall:获取所有的键值对
    • hdel:删除某一个field
    • hlen:获取hash长度
    • hexists:判断field是否存在
    • hkeys:获取hash所有的key
    • kvals:获取hash所有的value
    • hincrby,hdecrby:hash中field自增、自减
    • hsetnx:当field不存在时设置值
  • Zset类型相关命令

    • zadd:向zset中增加元素
    • zrange,zrevrange:按照索引正序、倒序列出范围内的元素
    • zrangebyscore,zrevrangebyscore:按照score正序、倒序列出范围内的元素
    • zrem:移除zset中某一个元素
    • zcard:统计zset长度
    • zcount:统计某个score范围内的元素个数
  • Geospatial类型相关命令(Zset命令全部适用)

    • geoadd:添加地理经纬度信息,经纬度有范围限制,超过则报错
      127.0.0.1:6379> geoadd city 116.40 39.90 beijing
      (integer) 1
      127.0.0.1:6379> geoadd city 121.47 31.23 shanghai
      (integer) 1
      127.0.0.1:6379> geoadd city 106.50 29.53 chongqing
      (integer) 1
      127.0.0.1:6379> geoadd city 114.05 22.53 shenzhen
      (integer) 1
      127.0.0.1:6379> geoadd city 120.16 30.24 hangzhou
      (integer) 1
      127.0.0.1:6379> geoadd city 108.96 34.26 xian
      (integer) 1
    • geopos:获取某个地方的地理位置
      127.0.0.1:6379> geopos city beijing
      1) 1) "116.39999896287918091"
         2) "39.90000009167092543"
         
      127.0.0.1:6379> geopos city beijing shenzhen
      1) 1) "116.39999896287918091"
         2) "39.90000009167092543"
      2) 1) "114.04999762773513794"
         2) "22.52999956292396888"
    • geodist:计算两地之间的距离
      127.0.0.1:6379> geodist city beijing shenzhen
      "1944681.9952"
      
      #设置单位
      127.0.0.1:6379> geodist city beijing shenzhen km
      "1944.6820"
      127.0.0.1:6379> geodist city beijing shanghai km
      "1067.3788"
    • georadius:查询某地范围内的地区
      127.0.0.1:6379> GEORADIUS city 114.05 22.50 1000 km
      1) "shenzhen"
      127.0.0.1:6379> GEORADIUS city 114.05 22.50 10000 km
      1) "chongqing"
      2) "xian"
      3) "shenzhen"
      4) "hangzhou"
      5) "shanghai"
      6) "beijing"
      
      # 带上经纬度信息
      127.0.0.1:6379> GEORADIUS city 114.05 22.50 5000 km withcoord 
      1) 1) "chongqing"
         2) 1) "106.49999767541885376"
            2) "29.52999957900659211"
      2) 1) "xian"
         2) 1) "108.96000176668167114"
            2) "34.25999964418929977"
      3) 1) "shenzhen"
         2) 1) "114.04999762773513794"
            2) "22.52999956292396888"
      4) 1) "hangzhou"
         2) 1) "120.1600000262260437"
            2) "30.2400003229490224"
      5) 1) "shanghai"
         2) 1) "121.47000163793563843"
            2) "31.22999903975783553"
      6) 1) "beijing"
         2) 1) "116.39999896287918091"
            2) "39.90000009167092543"
            
      # 限定统计个数
      127.0.0.1:6379> GEORADIUS city 114.05 22.50 5000 km withcoord count 1
      1) 1) "shenzhen"
         2) 1) "114.04999762773513794"
            2) "22.52999956292396888"
      127.0.0.1:6379> GEORADIUS city 114.05 22.50 5000 km withcoord count 2
      1) 1) "shenzhen"
         2) 1) "114.04999762773513794"
            2) "22.52999956292396888"
      2) 1) "hangzhou"
         2) 1) "120.1600000262260437"
            2) "30.2400003229490224"
            
      #带上距离
      127.0.0.1:6379> GEORADIUS city 114.05 22.50 5000 km withcoord withdist count 2
      1) 1) "shenzhen"
         2) "3.3367"
         3) 1) "114.04999762773513794"
            2) "22.52999956292396888"
      2) 1) "hangzhou"
         2) "1053.9526"
         3) 1) "120.1600000262260437"
            2) "30.2400003229490224"
    • georadiusbymember:使用存入redis的地区进行范围查找
      127.0.0.1:6379> GEORADIUSBYMEMBER city chongqing 1000 km
      1) "chongqing"
      2) "xian"
      127.0.0.1:6379> GEORADIUSBYMEMBER city chongqing 2000 km
      1) "chongqing"
      2) "xian"
      3) "shenzhen"
      4) "hangzhou"
      5) "shanghai"
      6) "beijing"
      127.0.0.1:6379> GEORADIUSBYMEMBER city shanghai 1000 km
      1) "hangzhou"
      2) "shanghai"
    • geohash:返回地方经纬度的hash
      127.0.0.1:6379> geohash city shenzhen
      1) "ws105m2wv80"
      127.0.0.1:6379> geohash city shenzhen beijing
      1) "ws105m2wv80"
      2) "wx4fbxxfke0"
  • HyperLogLog类型相关命令

    #pfadd 添加元素
    127.0.0.1:6379> pfadd k1 a b d e f g h i
    (integer) 1
    #pfcount 统计基数个数
    127.0.0.1:6379> pfcount k1
    (integer) 8
    127.0.0.1:6379> pfadd k2 h i j k
    (integer) 1
    127.0.0.1:6379> pfcount k2
    (integer) 4
    #pfmerge 合并两组元素到一个新的key中
    127.0.0.1:6379> pfmerge k3 k1 k2
    OK
    127.0.0.1:6379> pfcount k3
    (integer) 10
    #去除重复计数
    127.0.0.1:6379> pfadd k4 a a a a b
    (integer) 1
    127.0.0.1:6379> pfcount k4
    (integer) 2
  • BitMap类型命令

    #添加一个元素
    127.0.0.1:6379> setbit sign 0 1
    (integer) 0
    127.0.0.1:6379> setbit sign 1 0
    (integer) 0
    127.0.0.1:6379> setbit sign 2 0
    (integer) 0
    127.0.0.1:6379> setbit sign 3 0
    (integer) 0
    #获取某一个元素
    127.0.0.1:6379> getbit sign 2
    (integer) 0
    #统计值为1的数量
    127.0.0.1:6379> bitcount sign
    (integer) 1