Redis基本知识
redis-server #启动redis服务
shutdown #停止redis服务
redis-cli -p 6379 #使用redis客户端进行连接
使用redis客户端的命令
keys * #查看所有key
flushdb #清空当前数据库的内容
flushall #清空所有所有数据库的内容
select 3 #切换数据库
DBSIZE #查看DB大小
redis-benchmark性能测试
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
Redis是单线程的!
官方表示,Redis基于内存操作,CPU不是Redis的性能瓶颈
Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样是使用key-value的Memecache差!
Redis 为什么单线程还这么快?
1、误区1:高性能的服务器一定是多线程的?
2、误区2:多线程(CPU上下文会切换!)一定比单线程效率高!
先去CPU>内存>硬盘的速度要有所了解!
Redis-Key
EXISTS name #判断当前的Key是否存在
move name 1 #移除当前的Key
EXPIRE name 10 #设置Key的过期时间为10秒
ttl name #查看当前key的过期时间
type name #查看当前key的类型
String(字符串)
set key1 v1 #设置值
get key1 #获得值
EXISTS name #判断当前的Key是否存在
APPEND key1 "hello" #追加字符串,如果当前的key不存在,则相当于setkey
STRLEN key1 #获取字符串的长度
set views 0 #初始浏览量为0
incr views #自增1 浏览量变为1
decr views #自减1 浏览量变为0
INCRBY views 10 #可以设置步长,指定增量!
#字符串范围 range
GETRANGE key1 0 3 #截取字符串 [0,3]
GETRANGE key1 0 -1 #截取全部字符串 (与get key1一样)
#替换
SETRANGE key2 1 xx #替换指定位置开始的字符串!
setex(set with expire) #设置过期时间
setnx(set if exist) #不存在再设置 (在分布式锁中会常常使用)
setex key3 30 "hello" #设置key的值为hello,30秒后过期
setnx mykey "redis" #如果mykey不存在,创建mykey
setnx mykey "MongoDB" #如果mykey存在,创建m失败
#mset mget
mset k1 v1 k2 v2 k3 v3 #同时创建多个值
mget k1 v1 k2 v2 k3 v3 #同时获取多个值
msetnx k1 v1 k4 k4 #msetnx是一个原子性的操作,要么一起成功,要么一起失败
#对象
set user:1 {name:zhangsan,age:3} #设置一个user:1 对象 值为json字符来保存一个对象!
mset user:1:name zhangsan user:1:age 2 #设置多个对象值
mget user:1:name user:1:age #获取多个对象值
#getset
getset db redis #如果不存在,则返回nil,并设置值
getset db mongodb #如果存在值,获取原来的值,并设置新的值
List(列表)
LPUSH list one #将一个值或者多个值,插入到列表头部(左)
RPUSH list one #将一个值或者多个值,插入到列表头部(右)
LRANGE list 0 -1 #获取list中值
LRANGE list 0 1 #获取list中具体的值
###################################################
LPOP list #移除list的第一个元素(左)
RPOP list #移除list的第一个元素(右)
LINDEX list 0 #通过下标获得list中的某一个值!
Llen list #返回列表的长度
lrem list 1 three #移除list集合中指定个数的value,精确匹配
#trim
ltrim mylist 1 2 #通过下标截取指定的长度,这个list已经被改变,截断了其它元素只剩下截取的元素!
#rpoplpush 移除列表的最后一个元素,将他移动到新列表中
rpoplpush mylist myotherlist #移除列表的最后一个元素,将他移动到新列表中
lset #将列表中指定下标的值替换为另一个值,更新操作
lset list 0 item #如果不存在列表我们去更新就会报错
lset list 0 item #如果存在,更新当前下表的值
linsert #将某个具体的value插入到列把你某个元素的前面或者后面!
linsert mylist before "world" "other" (前面)
linsert mylist after "world" "new" (后面)
Set(无序不重复集合)
sadd myset "hello" #set集合中添加元素
SMEMBERS myset #查看指定set的所有值
SISMEMBER myset hello #判断某一个值是不是在set集合中
scard myset #获取set集合中内容元素个数
srem myset hello #移除set集合中的指定元素
srandmember myset #随机抽选出一个元素
srandmember myset 2 #随机抽选出指定个数的元素
spop myset #随机删除一些set集合中的元素
smove myset myset2 "kuangshen" #将一个指定的值移动到另外一个set集合中
SDIFF key1 key2 #差集
SINTER key1 key2 #交集 共同好友就可以这样实现
SUNION key1 key2 #并集
Hash
hset myhash field1 change #set一个具体key-value
hget myhash field1 #获取一个字段值
hmset myhash field1 change field2 hello #set多个key-value,如果value存在会被覆盖,与String同理
hmget myhash field1 field2 #获取多个字段值
hgetall myhash #获取全部的数据
hdel myhash field1 #删除hash指定的key字段,对应的value值也会随之消失
hlen myhash #获取hash表的字段数量
hexists myhash field1 #判断hash里的指定字段是否存在
hkeys myhash #只获得所有field
hvals myhash #只获得所有value
hset myhash field3 5 #指定增量
HINCRBY myhash field3 1 #为hash指定的字段增加数量
HINCRBY myhash field3 -1 #为hash指定的字段减少数量
hsetnx myhash field4 hello #如果不存在则可以设置
hsetnx myhash field4 world #如果存在则不能设置
hset user:1:name zhangsan user:1:age 2 #设置多个对象值
hget user:1:name user:1:age #获取多个对象值
Zset (有序集合)
zadd myset 1 one #添加一个值
zadd myset 1 one 2 two #添加多个值
zrange myset 0 -1 #获取所有的值
zrangebyscore salary -inf +inf #显示全部的用户 从小到大
zrevrange salary 0 -1 #显示全部的用户 从大到小
zrangebyscore salary -inf +inf withscores #显示全部的用户 并且附带工资
zrangebyscore salary -inf 2500 withscores #显示工资小于2500员工的升序排序
zrem salary change #移除有序集合中的指定元素
zcard salary #获取有序集合的个数
zcount myset 1 2 #获取指定区间的成员数量
三种特殊数据类型
geospatial 地理位置
GEOADD
# getadd 添加地理位置
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 150.45 22.23 chongqing
(integer) 1
GEOPOS
127.0.0.1:6379> geopos china:city beijing #获取指定的城市的经度和纬度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
GEODIST
两人之间的距离!
单位:
· m 表示单位为米
· km 表示单位为千米
· mi 表示单位为英里
· ft 表示单位为英尺
127.0.0.1:6379> geodist china:city beijing shanghai km #查看上海到北京的直线距离
"1067.3788"
GEORADIUS
GEORADIUS china:city 121 31 1000 km #以121,31为中心,寻找方圆1000km内的城市
127.0.0.1:6379> georadius china:city 121 31 500 km
1) "shanghai"
georadius china:city 121 31 500 km withdist #显示到中间距离的位置
127.0.0.1:6379> georadius china:city 121 31 500 km withdist
1) 1) "shanghai"
2) "51.5509"
georadius china:city 121 31 500 km withcoord #显示他人的定位信息
127.0.0.1:6379> georadius china:city 121 31 500 km withcoord
1) 1) "shanghai"
2) 1) "121.47000163793563843"
2) "31.22999903975783553"
georadius china:city 121 31 500 km withdist withcoord count 1
#筛选出指定的结果!
127.0.0.1:6379> georadius china:city 121 31 500 km withdist withcoord count 1
1) 1) "shanghai"
2) "51.5509"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
GEORADIUSBYMEMBER
#找出位于指定元素周围的其他元素!
georadiusbymember china:city beijing 1000 km
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
GEOHASH 命令 -返回一个或多个位置元素的GEOHASH表示
#将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近
geohash china:city beijing
127.0.0.1:6379> geohash china:city beijing
1) "wx4fbxxfke0"
GEO底层的实现原理其实就是Zset 我们可以使用Zset命令来操作GEO
zrange china:city 0 -1
127.0.0.1:6379> zrange china:city 0 -1
1) "shanghai"
2) "beijing"
3) "chongqing"
zrem china:city beijing #移除指定元素
Hypeloglog 统计不重复
PFADD mykey
PFADD mykey a b c d e f g h i j #创建第一组元素 mykey
PFCOUNT mykey #统计mykey并集数量
#因为第一组不存在重复的值,因此统计出的并集数量为10
PFADD mykey2 i j z x c v b n m #创建第二组元素 mykey2
PFCOUNT mykey2 #统计mykey2并集数量
PFNERGE mykey3 mykey mykey2 #使用mykey3将mykey和mykey2整合在一起并统计
PFOUNT mykey3 #再次统计并集数量
如果允许容错,那么一定可以使用Hypeloglog!
如果不允许容错,就使用set或者自己的数据类型即可!
Bitmap
位存储
统计用户信息,活跃,不活跃!登录、未登录!打卡、365打卡!两个状态的,都可以使用Bitmap!
Bitmap 位图,数据结构!都是操作二进制来进行记录,就只有0和1两个状态!
365 天 = 365 bit 1字节 = 8bit 46个字节左右!
使用bitmap来记录 周一到周日的打卡!
周一:1 周二:0 周三:0 周四:1 ...
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> set