基础操作
1.redis有16个数据库,使用命令< select * > 切换数据库
2.keys * 查询全部key
3.清空当前的数据库的内容:flushdb
4.清空全部数据库的内容:flushall
五大数据类型
1).string类型
1.判断当前key是否存在:exists key
2.移除指定数据库内的key:move key 1
3.设置key的过期时间,单位是秒:expire;查看当前key的剩余时间 :ttl key
4.查看当前key的类型:type key
5.set key 0 incr key #自增1
6.decr key # 自减1
7.incrby key 10 #加指定数量(步长)
8. decrby key 10 #减指定数量(步长)
9.截取字符串指定地址:getrange key 0 3(-1,全部) 替换指定位置开始的字符串:setrange key 1 xx
10.设置key带有过期时间:setex(set with expire) setex key 30 “HELLO”(和expire 区别是:expire必须存在这个key才能设置过期时间 )
11.不存在再设置:setnx(set if not exist) setnx key “redis” —> 1 setnx key “MongoDB” —> 0
12.批量set与get mset k1 v1 k2 v2 k3 v3 mget k1 k2 k3 msetnx k1 v1 k2 v4 #原子性,要么全部成功,不然全部失败
13.存在值则获取原来的值,并设置新的值 getset key “redis”
2).List类型
1.所有指令都是以L 开头 LPUSH list one #将一个值或者多个值,插入到列表头部(左)
2.RPUSH list one #将一个值或者多个值,插入到列表头部(右)
3.LRANGE list 0 1 通过区间获取具体的值
4. LRANGE list 0 -1 获取list全部的值
5.LPOP list 移除列表的第一个元素 (或者说是移除队列最左边元素)
6.RPOP list 移除最后一个元素(或者说是移除队列最右边元素)
6.通过获取list某一个值 : Lindex list 1
7.获取列表的长度: Llen list
8.移除列表指定个数的值:lrem list 1 one
9.通过下标截取指定的长度:Ltrim list 1 2 (list会被改变)
10.移除列表最后一个元素到新的列表中:rpoplpush list1 1 list2
11.将指定下标的值更新成为另外的值,更新操作(如果不存在则会报错): lset list 0 item
12.将某一个具体的值插入到列表中插入到指定值得前面或后面:linsert list before “value1” “value2”
小结:实际上是一个链表,before node left,两边都可以插入值。消息队列(Lpush Rpop),栈(Lpush Lpop)
3).Set类型:set类型中元素不可以重复
1.sadd set1 1 2 3 4 #set集合中添加元素
2.smembers set1 #查询集合所有内容
3.sismember set1 1 #查询set中是否存在某个元素(1:存在,0不存在)
4.scard set1 #获取set集合中个数
5.srem set1 1 #移除指定元素
6.srandmember set1 1 #随机获取一个元素
7.spop set1 #随机移除一个元素
8.smove set1 set2 “值” #移动指定的值到新的集合中
9.sdiff set1 set2 #差集
10.sinter set1 set 2 #交集 共同好友
11.sunion set1 set2 #并集
4).Hash类型
当作Map集合,key-map(或者key-),值是Map集合
(hash1:哈希 filed1:哈希中一个key hello:哈希中一个key对应的value)
1.hset hash1 filed1 hello #set一个具体的key-vlaue
2.hget hash1 filed1 #获取一个字段值
3.hmset hash1 filed1 hello1 filed2 hello2#set多个具体的key-vlaue
4.hmget hash1 filed1 filed2#获取多个字段值
5.hgetall hash1 #获取hash1 所有字段值
6.hdel hash1 filed1 #删除hash1指定的key(filed1 )字段,与key对应的value也删除了
7.hlen hash1 #获取hash1长度
8.hexists hash1 field1 #判断hash1中的key是否存在
9.hvals hash1 #获取指定hash1所有的值
10.hset hash1 filed1 1 #指定增量
11.hincrby hash1 filed1 n #n>0自增,例如1;n<0自减,例如-1
12.hsetnx hash1 filed1 hello #如果不存在可以设置成功;如果存在则不能设置
5).zset类型(有序集合)
在set的基础上,增加了一个序号值:
set: sadd k1 v1
zset: zadd k1 score v1(score可以是1,2,3这些)
1.zadd zset1 1 one #添加一个值
2.zadd zset1 2 two 3 three #添加多个值
3.zrange zset1 0 -1 获取zset所有值
4.zrangebyscore zset1 -inf +inf #把所有从小到大排序(one,two ,three )
语法:zrangebyscore key min max
5.zrangebyscore zset1 -inf +inf withscores #把所有从小到大排序并带上score(one,1,two,2,three,3)
6.zrevrange zset1 0 -1 #把所有从大到小排序(three,two ,one )
6.zrem zset1 one #移除指定的元素
7.zcard zset1 #获取有序集合zset1的个数
8.zcount zset1 1 3#获取指定区间的成员数量
三种特殊数据类型
1).Geospatial地理位置
有效的经度:-180度到180度
有效的维度:-85.05112878度到85.05112878
1.geoadd #添加地理位置,南北两极无法直接添加,一般会下载数据,直接通过JAVA程序一次性导入,geoadd key 经度 维度 城市名称
geoadd china:city 116.40 39.90 beijing
2.geopos china:city beijing #获取指定城市的经度维度,获得当前定位
3.geodist #两点之间的距离,两人之间的距离
单位:
m:米(不指定默认为米)
km:千米
mi:英里
ft:英尺
geodist china:city beijing shanghai #查询结果多少米
geodist china:city beijing shanghai km #查询结果多少千米
4.georadius #以给定的经纬度为中心,查询某一半径内的元素(附近的人)
georadius china:city 110 30 500 km #查询出以经纬度(110,30)为中心附件500千米的城市
georadius china:city 110 30 500 km withdist #查询出以经纬度(110,30)为中心附件500千米的城市,并显示直线距离
georadius china:city 110 30 500 km withcoord #查询出以经纬度(110,30)为中心附件500千米的城市,并显示查出记录的经纬度
georadius china:city 110 30 500 km count 2 #查询出以经纬度(110,30)为中心附件500千米的城市,并显示查询结果中两条记录
georadius china:city 110 30 500 km withdist withcoord count 2 #查询出以经纬度(110,30)为中心附件500千米的城市,并显示直线距离,记录的经纬度,及查询结果中两条记录
5.georadiusbymember #查询指定元素周围多少距离的其他元素
georadiusbymember china:city shanghai 500km #查询上海500km范围内的其他城市
6.geohash china:city bejing #返回一个或多个位置元素的geohash表示,将返回11个字符的Geohash字符串,两个字符串越接近代表距离越近
GEO底层的实现原理其实就是zset!可以用zset命令来操作geo
场景应用:可用于 实现 获取某个地点的坐标、计算两个地点的直接距离、某个地点坐标多少范围内的地点有哪些等等
(类似现实生活中的附近的人功能)
底层:Geospatial 底层其实是 zset 可以用zset命令操作geo
zrange china:city 0 -1 #查询所有元素
zrem china:city beiing #移除指定元素
2).HyperLogLog
Redis HyperLogLog 是用来做基数(不重复的元素,可以接受误差)统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的(2^64,12KB内存)、并且是很小的。0.81%错误率,统计网页UV时可以忽略不计。
1.pfadd mykey a b c d e f g h i j #创建第一组元素mykey
2.pfcount mykey #统计第一组mykey基数,结果为10
3.pfadd mykey2 i j k l m n a b #创建第二组元素mykey2
4.pfcount mykey2 #统计第二组mykey2基数,结果为8
5.pfmerge mekey3 mykey mykey2 #合并两组mykey ,mykey2到mykey3,并集
6.pfcount mykey3 #统计第三组并集mykey3基数,结果为14,里边包含(a,b,c,d,e,f,g,h,i,j,k,l,m,n)
3).Bitmap位存储
场景应用: 统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用Bitmaps!
优点:Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
1.setbit key1 0 1 #setbit key offset value(value只有0或者1),设置(比如周一到周末打卡情况)
2.getbit key1 0 #getbit key offset,获取(比如查看某一天打卡情况)
3.bitcount key1 #bitcount key [start end]统计数据(比如统计这周key1的打卡情况)
Redis发布订阅
1.subscribe channel[channel …] #订阅一个或者多个频道
2.publish channel message #将消息(message)发布到指定的频道(channel)
3.psubscribe pattern [pattern …] #订阅一个或者多个符合给定模式的频道
4.pubsub subcommand [argument [argument …]] #查看订阅与发布系统状态
5.punsubscribe [pattern [pattern …]] #退订所有给定模式的频道
6.unsubscribe [channel [channel …]] # 退订指定的频道
测试:
订阅端:
127.0.0.1:6379> subscribe daidai #订阅一个频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "daidai"
3) (integer) 1
#等待消息推送
1) "message" #消息
2) "daidai" #哪个频道的消息
3) "hello,daidai!" #具体消息的的内容
1) "message"
2) "daidai"
3) "xiaoyueliang!"
发布端:
127.0.0.1:6379> publish daidai hello,daidai! #发布者发送消息到频道
(integer) 1
127.0.0.1:6379> publish daidai xiaoyueliang! #发布者发送消息到频道
(integer) 1