Redis基础知识

基础知识

  1. Redis默认有16个数据库,默认第0个。使用select n:进行切换数据库。
  2. Redis是一个内存中的数据结构存储系统,它可以用作数据库缓存消息中间件MQ
  3. Redis是单线程的!Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。
  4. Redis是将所有的数据全部放在内存中,单线程操作效率是最高的,多线程会使CPU进行上下文切换。

Redis-Key

  • keys *:查看当前数据库所有key。
  • dbsize:查看当前数据区占用空间。
  • flushdb:清除当前数据库;flushall:清除全部数据库。
  • exists key:查看是否存在指定 key ,存在返回1;不存在返回0。
  • move key n:将指定 key 移至指定数据库 n。
  • expire key time:设置指定 key 过期时间 time;ttl key:查看当前 key 剩余过期时间。
  • type key:查看 key值的数据类型。

五大基本数据类型

String(字符串)

  • append key value:在键key 后添加 值value。
  • strlen key:查看键key 长度。
  • incr key:当键key 为数字时,将当前键值加1;incrby key n:将步长设置为n,即将键值加n。
  • decr key:当键key 为数字时,将键值减1;decrby key n:将键值减n。
  • getrange key n1 n2:截取键值字符串。getrange key 0 -1:查看整个字符串。
  • setrange key n value:将key的值第n位后与value等长的字符串设置为value。
  • setex key time value:设置指定键值,并设置过期时间。
  • setnx key value:如果键key存在,则不设置;如果键key不存在,则设置为value。
  • mset k1 v1 k2 v2 ...:批量设置key-value键值对;mget k1 k2 ...:批量获取键值。
  • msetnx k1 v1 k2 v2 ...:原理同上,只不过是批量操作。原子性操作,所有设置要么一起成功,要么一起失败。
  • getset key value:先get key的值,再设置key的值为value。即进行两次单独的命令。

设置对象:

#常用语法:
set user:1 {name:qsy,age:18}    #设置一个user:1对象,值为json字符来保存一个对象
                                #这里的key是一个巧妙的设计: use:{id}:{field}

#不推荐语法:
mset user:1:name qsy user:1:age 18

List(列表)

  1. Redis可以将list用于栈、队列、阻塞队列。
  2. 所有list命令都是以 l字母 开头。
  • lpush list value1 value2:将一个或多个值插入到列表的头部。即始终插入到下标为0的位置。
  • rpush lsit value1 value2:与lpush相反,始终插入列表尾部。
  • lrange list n1 n2:获取列表指定位置范围的元素。
  • lpop list:返回并移除列表第一个元素。
  • rpop list:返回并移除列表最后一个元素。
  • lindex list n:通过下标n 获取list中的元素。
  • lset list n value:将列表下表为n的元素设置值为value。该下标必须存在元素,否则修改失败。
  • linsert list before/after value1 value2:在列表中值为value1的元素前或后插入一个值为value2的元素。若列表中有多个value1,只对第一个有效。
  • llen lsit:返回list长度。
  • lrem list count value:从下标0开始,移除count个指定list的值为value的元素。
  • ltrim list n1 n2:通过下表截取list指定长度。
  • rpoplpush:移除列表最后一个元素,并添加到另一个列表第一个元素。

小结:

List实际上是一个链表,左右都可以插入值。在两边插入或改动值,效率最高;插入或修改中间元素,效率相对较低。

Set(集合)

  1. Set是一个无序不重复集合。
  2. 所有set命令都是以 s字母开头。
  • sadd set value:向指定的set里添加value元素。
  • smembers set:查看指定set的所有值。
  • sismember set value:判断某一元素是否在set中。
  • scard set:获取set元素个数。
  • srem set value:移除set中指定元素。
  • srandmember set count:随机获取set中count个元素,count不指定默认为1。
  • spop set count:随机删除set中count个元素,count不指定默认为1。
  • smove set1 set2 value:将set1中value元素移至set2。
  • sdiff set1 set2:查找set1中所有不在set2内的元素。(即set1对set2的差集)
  • sinter set1 set2:查找set1和set2中共同的元素。(即set1对set2的交集)
  • sunion set1 set2:查找set1和set2中所有的元素。(即set1和set2的并集)

Hash(map集合)

  1. 一个Map集合(key-map),即每个键值对的值为一个map集合。
  2. 所有hash命令都是以 h字母开头。
  • hset hash key value:向指定hash添加key-value键值对。
  • hget hash key:获取指定hash的key对应的值。
  • hmset hash k1 v1 k2 v2 ...:批量设置。
  • hmget hash k1 k2 ...:批量获取。
  • hgetall hash:获取hash中所有键值对。每一个键值对单独分行显示。
  • hdel hash key:删除hash中指定键。
  • hlen hash:获取hash长度。
  • hkeys hash:获取hash中所有key。hvals hash:获取hash中所有value。
  • incrby hash key n:将hash中指定key的键值加n。
  • hsetnx hash key value:如果hash中指定key不存在,则加入键值对key-value,否则不操作。

Zset(有序集合)

  1. 在set的基础上,增加了一个score值,用于排序。
  • zadd zset n1 value1 n2 value2:向zset中添加元素。
  • zrange zset n1 n2:查询zset指定下标范围内的元素;zrange zset 0 -1:查询所有元素。
  • zrangebyscore zset -inf +inf [withscores]:对zset进行顺序排序输出。-inf+inf指定最小值和最大值。
  • zrevrangebyscore zset +inf -inf [withscores]:对zset进行降序排序输出。
  • zrem zset value:移除元素。
  • zcount zset n1 n2:获取score在区间[n1,n2]中的元素数量。

三种特殊数据类型

geospatial地理位置

  1. geo底层实现原理为zset,所以可用zset的命令进行操作。
  • geoadd key lon lat member:添加指定区域地理位置。举例:geoadd china:city 116.40 39.90 beijing。
  • geopos key member1 member2 ...:获取指定区域地理位置。举例:geopos china:city beijing anhui。
  • geodist key member1 member2 [unit]:获取两个地理位置的直线举例。unit:单位。举例:geodist china:city beijing anhui km。
  • georadius key lon lat radius m|km [withcoord] [withdist]:以指定经纬度为中心,获取半径为radius内的所有member。withcoord:显示member经纬度;withdis:显示距离。
  • georadius key member radius m|km [withcoord] [withdist]:以指定member为中心,获取半径为radius内的所有member,包括自己。

Hyperloglog

  1. Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

  2. 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

  3. 传统网页,使用set保存用户id,然后统计set中的元素数量确定访问量。这个方式如果保存大量用户id,就会比较麻烦。我们的目的是为了计数,而不是保存用户id。

  • pfadd key v1 v2 ...:向指定key添加元素。
  • pfcount key:统计key中不重复元素数量。
  • pmerge key1 key2 key3:将key2和key3中元素合并到key1中。

Bitmaps

  1. 位存储。通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。
  2. 使用场景:可以统计用户 登录/未登录、活跃/不活跃、打卡/未打卡等信息。
  3. Bitmap位图,通过操作二进制位来进行记录,只有0和1两个状态。
  • setbit key offset value:设置指定key第offset位值为value(0/1)。举例:setbit key 5 1 。
  • getbit key offset:获取指定key第offset位的值。
  • bitcount key:统计key中位值为1的数量。

你可能感兴趣的:(Redis基础知识)