String类型命令:
#incr自增1
#decr自减1
#incrby 加步长
#decrby减步长
#incr自增1
#decr自减1
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views #初始量为0
"0"
127.0.0.1:6379> incr views #自增1 数量为2
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views #自减1 数量为1
(integer) 1
127.0.0.1:6379> get views
"1"
#incrby 步长
127.0.0.1:6379> incrby views 10 #设置步长为10
(integer) 11 //加十
127.0.0.1:6379> decrby views 5 //减5
(integer) 6 //减5
127.0.0.1:6379>
#setrange替换
#setex (set with expire) 设置过期时间
#setnx (set if not expire) 不存在再设置(在分布式锁中常使用)
#mset//批量设置key
#mget//批量获取value
127.0.0.1:6379> setex key3 30 "ha" //设置key3的值为hallo,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 21
127.0.0.1:6379> setnx mykey "redis" //如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "views"
2) "mykey"
3) "key1"
4) "age"
5) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB"//如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
==========================================
#mset//批量设置key
#mget//批量获取value
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 //同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3 //同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx是一个原子性的操作,要么成功要么失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
list类型
使用场景:栈、队列、阻塞队列
flushdb:清空当前数据库中的所有key
命令以 l 开头:
127.0.0.1:6379> lpush list 1//将一个或者多个值,插入列表头部(左)rpush插入右边
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1 //获取list的值
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange list 0 1 //通过区间获取具体值
1) "3"
2) "2"
==========================================
lpop//移除
rpop
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lpop list //移除list的第一个元素
"3"
127.0.0.1:6379> rpop list//移除list的最后一个元素
"1"
127.0.0.1:6379> lrange list 0 -1
1) "2"
==========================================
lindex//通过下标获取List中的某一个值
127.0.0.1:6379> lindex list 0//通过下标获得list中的某一个值
"2"
==========================================
llen//返回列表长度
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> llen list //返回列表长度
(integer) 3
==========================================
移除指定的值
比如取关粉丝
lrem:
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrem list 1 1 //移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lrem list 2 3//移除list中两个为3的值
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "2"
==========================================
trim修剪:list截断!
127.0.0.1:6379> lrange mylist 0 -1
1) "3"
2) "2"
3) "1"
4) "hallo1"
5) "hallo1"
127.0.0.1:6379> ltrim mylist 2 2 //通过下标截取指定的长度,list已经被改变了,截取了剩下的元素!
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
==========================================
rpoplpush//移除列表的最后一个元素,将他移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist my1list//移除列表的最后一个元素,将他移动到新的列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1//查看原来的值
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange my1list 0 -1//查看目标的值
1) "hello2"
==========================================
lset将列表中指定下标的值替换为另外一个值,相当于更新操作
127.0.0.1:6379> exists list//判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item//如果不存在我们去更新就会报错
(error) ERR no such key
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "1"
127.0.0.1:6379> lset list 0 item//如果存在,更新当下的操作
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lset list 1 oo//如果不存在则会报错
(error) ERR index out of range
==========================================
linsert//将某一个的具体的value插入到某个元素的前面或者后面
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> linsert list before item 1 //向item的前面插入1
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "item"
127.0.0.1:6379> linsert list after item 1 //向item的后面插入2
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "item"
3) "1"
Set(集合)
set中的值是不能重读无序
127.0.0.1:6379> sadd myset hello //set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset hello1
(integer) 1
127.0.0.1:6379> sadd myset hello2
(integer) 1
127.0.0.1:6379> smembers myset//查看指定set的所有值
1) "hello2"
2) "hello"
3) "hello1"
127.0.0.1:6379> sismember myset hello//判断某一个值是不是在set集合中
(integer) 1//在就1
127.0.0.1:6379> sismember myset hello4
(integer) 0//不在就0
==========================================
rem移除set集合中的指定元素
127.0.0.1:6379> smembers myset//查看set集合中的元素
1) "hello2"
2) "hello"
3) "hello1"
127.0.0.1:6379> srem myset hello //移除set集合中指定元素
(integer) 1
127.0.0.1:6379> scard myset//返回集合中元素的数量
(integer) 2
127.0.0.1:6379> smembers myset。。再次查看
1) "hello2"
2) "hello1"
==========================================
srandmember 随机抽取一个数据
127.0.0.1:6379> srandmember myset//随机抽取
"hello1"
127.0.0.1:6379> srandmember myset
"hello2"
127.0.0.1:6379> srandmember myset 2 //随机抽取两个数据
1) "hello2"
2) "hello1"
==========================================
删除指定的key,随机删除key
127.0.0.1:6379> smembers myset //查看
1) "hello2"
2) "hello1"
127.0.0.1:6379> spop myset //随机删除一个
"hello2"
127.0.0.1:6379> smembers myset //再次查看只有一个了
1) "hello1"
==========================================
将一个指定的值,移动到另外一个set集合中:smove
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
127.0.0.1:6379> sadd myset 3
(integer) 1
127.0.0.1:6379> sadd myset1 1
(integer) 1
127.0.0.1:6379> smove myset myset2 2//将一个指定的值,移动到另外一个set集合
(integer) 1
127.0.0.1:6379> smembers myset
1) "1"
2) "3"
127.0.0.1:6379> smembers myset1
1) "1"
127.0.0.1:6379> smembers myset2
1) "2"
==========================================
并集,场景比如共同关注
127.0.0.1:6379> sadd key1 1
(integer) 1
127.0.0.1:6379> sadd key1 2
(integer) 1
127.0.0.1:6379> sadd key1 3
(integer) 1
127.0.0.1:6379> sadd key2 3
(integer) 1
127.0.0.1:6379> sadd key2 4
(integer) 1
127.0.0.1:6379> sadd key2 5
(integer) 1
127.0.0.1:6379> sdiff key1 key2 //差集
1) "1"
2) "2"
127.0.0.1:6379> sinter key1 key2 //交集 场景共同好友可以实现
1) "3"
127.0.0.1:6379> sunion key1 key2 //并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
Hash(哈希)
值是一个map集合,本质和String类型没有太大区别,还是一个简单的key-value!
127.0.0.1:6379> hset myhash field1 juju //set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash field1 //获取一个字段值
"juju"
127.0.0.1:6379> hmset myhash field1 juju1 field2 juju2 //设置多个key-value值
OK
127.0.0.1:6379> hmget myhash field1 field2 //获取多个字段值
1) "juju1"
2) "juju2"
127.0.0.1:6379> hgetall myhash //获取全部的数据key-value
1) "field1"
2) "juju1"
3) "field2"
4) "juju2"
==========================================
del删除hash指定key字段
127.0.0.1:6379> hdel myhash field1 //删除指定key字段,value也被删除
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "juju2"
==========================================
hlen获取长度
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "juju2"
127.0.0.1:6379> hlen myhash//获取字段数量
(integer) 1 //只有一个map键值对
==========================================
//获取所有的key或value
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "juju2"
3) "field1"
4) "1"
127.0.0.1:6379> hkeys myhash //获取所有的key
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash //获取所有的value
1) "juju2"
2) "1"
==========================================
incr decr
127.0.0.1:6379> hset myhash field3 5
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1 //指定增量1
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1 //指定减1
(integer) 5
127.0.0.1:6379> hsetnx myhash field3 juju3 //如果存在不能设置
(integer) 0
127.0.0.1:6379> hsetnx myhash field4 juju4 //如果不存在可以设置
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "juju2"
3) "field1"
4) "1"
5) "field3"
6) "5"
7) "field4"
8) "juju4"
hash更适合对象的存储,string更加适合字符串存储
zset(有序集合)
127.0.0.1:6379> zadd myset 1 one //添加单个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three //添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1//打印所有值
1) "one"
2) "two"
3) "three"
==========================================
排序
127.0.0.1:6379> zadd salary 2522 xiaohong //添加多个数据
(integer) 1
127.0.0.1:6379> zadd salary 2521 xiaoli
(integer) 1
127.0.0.1:6379> zadd salary 2523 xiaozhang
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 //查看所有数据
1) "xiaoli"
2) "xiaohong"
3) "xiaozhang"
127.0.0.1:6379> zrangebyscore salary -inf +inf //显示数据,从小到大
1) "xiaoli"
2) "xiaohong"
3) "xiaozhang"
127.0.0.1:6379> zrevrange salary 0 -1 //显示数据,从大到小
1) "xiaozhang"
2) "xiaohong"
3) "xiaoli"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores //显示数据,从小到大带成绩
1) "xiaoli"
2) "2521"
3) "xiaohong"
4) "2522"
5) "xiaozhang"
6) "2523"
127.0.0.1:6379> zrangebyscore salary -inf 2600 withscores //显示数据小于2600的员工升序
1) "xiaoli"
2) "2521"
3) "xiaohong"
4) "2522"
5) "xiaozhang"
6) "2523"
==========================================
//移除rem中的元素
127.0.0.1:6379> zrange salary 0 -1
1) "xiaoli"
2) "xiaohong"
3) "xiaozhang"
127.0.0.1:6379> zrem salary xiaoli //移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xiaohong"
2) "xiaozhang"
127.0.0.1:6379> zcard salary //显示个数
(integer) 2
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores //显示数据从小到大
1) "xiaoli"
2) "1500"
3) "xiaohong"
4) "2522"
5) "xiaozhang"
6) "2523"
127.0.0.1:6379> zcount salary 1500 2600 //获取指定区间的成员数量
(integer) 3
==========================================
案例思路:set排序、存储班级成绩表、工资表排序、排行榜应用实现
三种特殊数据类型
geospatial地理位置
功能可以推算地理位置的信息,两地之间的距离,方圆几里的人
相关六个命令:GEOADD,
GEODIST,
GEOHASH,
GEOPOS,
GEORADIUS,
GEORADIUSBYMEMBER
添加地理位置
geoadd
添加地理位置
//有效的经度从-180度到180度
//当坐标位置超出上述指定位置时,该命令将会返回一个错误
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 106.50 29.53 chongqin 114.05 22.52 shenzhen//添加多个
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
==========================================
geopos
当前定位:坐标值
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing chongqin
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
==========================================
geodist
两地点的距离
127.0.0.1:6379> geodist china:city beijing shanghai km //查看北京到上海的距离
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqin km//查看北京到重庆的距离
"1464.0708"
==========================================
获取附近的人的地址(定位!)通过半径来查询
georadius
127.0.0.1:6379> georadius china:city 110 30 1000 km //显示经度和纬度半径1000km的位置
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km //显示经度和纬度半径500km的位置
1) "chongqin"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist//显示它和中间距离的距离
1) 1) "chongqin"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord//显示他人的定位信息
1) 1) "chongqin"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1//筛选只要一个
1) 1) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
==========================================
georadiusbymember
找出位于指定元素的其他元素(距离北京1000km的城市)
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
geo底层实现原理的基于Zset!我们可以使用Zset的命令来操作
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city xian
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqin"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"
Hyperloglog
Redis Hyperloglog:基数统计的算法! 有容错率
网页的UV(一个人访问一个网站多次,但是还是算作一个人)
127.0.0.1:6379> pfadd mykey 1 2 3 4 5 6 7 8 9//创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount mykey //统计mykey元素的基数数量
(integer) 9
127.0.0.1:6379> pfadd mykey2 1 3 11 10 //创建第二组元素
(integer) 1
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 //合并两组 mykey mykey2=>mykey3
OK
127.0.0.1:6379> pfcount mykey3 //看并集的数量
(integer) 11
Bitmap
位存储
统计用户信息,活跃用户,不活跃,登录,打卡...两个状态的 ,都可以使用Bitmap!
127.0.0.1:6379> setbit sign 0 1 //添加值
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 2 获取值
(integer) 1
查看某一天是否打卡
127.0.0.1:6379> getbit sign 2
(integer) 1
//统计打卡天数
127.0.0.1:6379> bitcount sign
(integer) 2