基础知识
- Redis默认有16个数据库,默认第0个。使用
select n
:进行切换数据库。 - Redis是一个内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。
- Redis是单线程的!Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。
- 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(列表)
- Redis可以将list用于栈、队列、阻塞队列。
- 所有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(集合)
- Set是一个无序不重复集合。
- 所有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集合)
- 一个Map集合(key-map),即每个键值对的值为一个map集合。
- 所有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(有序集合)
- 在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地理位置
- 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
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
传统网页,使用set保存用户id,然后统计set中的元素数量确定访问量。这个方式如果保存大量用户id,就会比较麻烦。我们的目的是为了计数,而不是保存用户id。
-
pfadd key v1 v2 ...
:向指定key添加元素。 -
pfcount key
:统计key中不重复元素数量。 -
pmerge key1 key2 key3
:将key2和key3中元素合并到key1中。
Bitmaps
- 位存储。通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。
- 使用场景:可以统计用户 登录/未登录、活跃/不活跃、打卡/未打卡等信息。
- 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的数量。