Redis(二)五种数据类型和三种特殊数据类型(笔记版)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值