【Redis笔记】数据类型应用笔记

问题解决

在使用flushdb删除redis数据的时候发生错误

(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

解决方案

#连接redis后运行 
#config set stop-writes-on-bgsave-error no 命令
#关闭配置项stop-writes-on-bgsave-error解决该问题。
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> keys *
1) "key:__rand_int__"
2) "name"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> 

Redis-Key

#获取全部的key
keys * 
#设置key value
set age 1
#查看是否有这个名字
exists name
#移动对应的name到 [database]数据库
move name 1
#设置过期时间
set name blank
expire name []
#获取剩余多少秒
ttl name
#查看当前key的类型
type name

五大数据类型

String

字符串一般命令

查看当前db中的key keys *

设置键值对 set key value

获取对应键的值 get key

判断是否有对应键 exists key

向当前键的值中添加一段字符串 append key 'hello' 如果当前值不存在,则相当于set key

结果展示

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> append key1 'hello'
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> 

字符串进阶

数字自动加减

自增1 incr key

自减1 decr key

增加某个值 incrby key 10

减小某个值 decrby key 4

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10
(integer) 10
127.0.0.1:6379> get views
"10"
127.0.0.1:6379> decrby views 4
(integer) 6
127.0.0.1:6379> get views
"6"

字符串截取

getrange key [start] [end] 闭区间

127.0.0.1:6379> get key1
"v1hello,blank,zhangsan"
127.0.0.1:6379> getrange key1 0 5
"v1hell"
127.0.0.1:6379> getrange key1 0 -1
"v1hello,blank,zhangsan"

setrange key [offect] ['替换成的']从offect开始替换成

127.0.0.1:6379> set ss abcde
OK
127.0.0.1:6379> get ss
"abcde"
127.0.0.1:6379> setrange ss 1 xx
(integer) 5
127.0.0.1:6379> get ss
"axxde"

设置过期时间

setex key time

127.0.0.1:6379> setex ssc 30 '???'
OK
127.0.0.1:6379> get ssc
"???"
127.0.0.1:6379> ttl ssc
(integer) 23

setnx if not exist

127.0.0.1:6379> set ssc hello
OK
127.0.0.1:6379> get ssc
"hello"
127.0.0.1:6379> setnx ssc redis
(integer) 0
127.0.0.1:6379> get ssc
"hello"
127.0.0.1:

批量设置和获取

mset [可变长度参数]

mget [可变长度参数]

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

msetnx [可变长度参数] 如果某个key已经存在,则这整个语句都不会被执行

127.0.0.1:6379> msetnx k1 v2 k4 v4
(integer) 0
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

设置对象

  • 使用json格式保存对象
127.0.0.1:6379> set user:1 {name:blank,age:3}
OK
127.0.0.1:6379> get user:1
"{name:blank,age:3}"
  • 变换设计方式
127.0.0.1:6379> mset user:2:name zhangsan user:2:age 2
OK
127.0.0.1:6379> mget user:2:name user:2:age
1) "zhangsan"
2) "2"

组合命令

getset key value

127.0.0.1:6379> getset db mysql
(nil)
127.0.0.1:6379> get db
"mysql"
127.0.0.1:6379> getset db redis
"mysql"
127.0.0.1:6379> get db
"redis"

List

list命令都是以l开头,基本指令

lpush 列表名 值 模拟栈类似左插入,左读取

127.0.0.1:6379> lpush list1 one
(integer) 1
127.0.0.1:6379> lpush list1 two
(integer) 2
127.0.0.1:6379> lpush list1 three
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "three"
2) "two"
3) "one"

rpush 列表名 值 模拟队列类似右插入,左读取

127.0.0.1:6379> rpush list2 one
(integer) 1
127.0.0.1:6379> rpush list2 two
(integer) 2
127.0.0.1:6379> rpush list2 three
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "one"
2) "two"
3) "three"

lpop 左弹出值rpop右弹出

127.0.0.1:6379> lpop list1
"three"
127.0.0.1:6379> lrange list1 0 -1
1) "two"
2) "one"
127.0.0.1:6379> rpop list1 
"one"
127.0.0.1:6379> lrange list1 0 -1
1) "two"

lrem key count value移除指定的值

127.0.0.1:6379> lrange list2 0 -1
1) "one"
2) "two"
3) "three"
4) "one"
127.0.0.1:6379> lrem list2 2 one 
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "two"
2) "three"
127.0.0.1:6379> lpush list2 one
(integer) 3
127.0.0.1:6379> lpush list2 one
(integer) 4
127.0.0.1:6379> lrem list2 1 one
(integer) 1
127.0.0.1:6379> lrange list2 0 -1
1) "one"
2) "two"
3) "three"

lindex list [index] 获取对应下标的值

127.0.0.1:6379> lrange list2 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379>  lindex list2 0
"one"
127.0.0.1:6379>  lindex list2 1
"two"
127.0.0.1:6379>  lindex list2 2
"three"

llen key 获取列表长度

127.0.0.1:6379> llen list2
(integer) 3

ltrim list start stop截取指定的位置

127.0.0.1:6379> rpush list n n n y y y n n n 
(integer) 9
127.0.0.1:6379> lrange list 0 -1
1) "n"
2) "n"
3) "n"
4) "y"
5) "y"
6) "y"
7) "n"
8) "n"
9) "n"
127.0.0.1:6379> ltrim list 3 3
OK
127.0.0.1:6379> lrange list 0 -1
1) "y"
127.0.0.1:6379> rpush list n n n y y y n n n 
(integer) 10
127.0.0.1:6379> lrange list 0 -1
 1) "y"
 2) "n"
 3) "n"
 4) "n"
 5) "y"
 6) "y"
 7) "y"
 8) "n"
 9) "n"
10) "n"
127.0.0.1:6379> ltrim list 4 6 
OK
127.0.0.1:6379> lrange list 0 -1
1) "y"
2) "y"
3) "y"
127.0.0.1:6379> 

rpoplpush 移除最后一个元素,添加到别的中

127.0.0.1:6379> lrange list 0 -1
1) "y"
2) "y"
3) "y"
127.0.0.1:6379> rpoplpush list other 
"y"
127.0.0.1:6379> lrange list 0 -1
1) "y"
2) "y"
127.0.0.1:6379> lrange other 0 -1
1) "y"

lset list 0 item下标替换元素

不存在会报错

127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> rpush list 0 1 2 3 4 5 6
(integer) 7
127.0.0.1:6379> lrange list 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
127.0.0.1:6379> lset list 0 99
OK
127.0.0.1:6379> lrange list 0 -1
1) "99"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"

linsert list [befor|after] [指定的字符串][插入的值]

127.0.0.1:6379> lrange list 0 -1
1) "99"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
127.0.0.1:6379> linsert list before 99 --
(integer) 8
127.0.0.1:6379> lrange list 0 -1
1) "--"
2) "99"
3) "1"
4) "2"
5) "3"
6) "4"
7) "5"
8) "6"
127.0.0.1:6379> linsert list after 99 ==
(integer) 9
127.0.0.1:6379> lrange list 0 -1
1) "--"
2) "99"
3) "=="
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "6"

list特点

  • 是一个链表,brfore node after ,左右都可以添加删除
  • 如果key不存在则会创建一个
  • 存在则添加
  • 当所有值都被移除以后,则key也不存在
  • 可以实现双端队列,列表,栈,队列,消息队列

Set

无序,不可重复

基本指令 (一般以s开头)

sadd set value添加

smembers key 查看值

sismember key value 查看key中是否有value值

scard key获取key中的元素个数

127.0.0.1:6379> sadd myset blank
(integer) 1
127.0.0.1:6379> sadd myset blank1 blank2
(integer) 2
127.0.0.1:6379> smembers myset
1) "blank"
2) "blank1"
3) "blank2"
127.0.0.1:6379> sismember myset blank
(integer) 1
127.0.0.1:6379> sismember myset blank3
(integer) 0
127.0.0.1:6379> scard myset
(integer) 3

srem key value移除指定元素

127.0.0.1:6379> srem myset blank
(integer) 1
127.0.0.1:6379> smembers myset
1) "blank1"
2) "blank2"

srandmember key随机抽选一个元素

127.0.0.1:6379> smembers myset
1) "blank1"
2) "blank2"
127.0.0.1:6379> srandmember myset
"blank2"
127.0.0.1:6379> srandmember myset
"blank1"
127.0.0.1:6379> srandmember myset
"blank1"

spop key 随机弹出一个幸运儿

127.0.0.1:6379> spop myset
"5"
127.0.0.1:6379> smembers myset
 1) "3"
 2) "1"
 3) "2"
 4) "blank1"
 5) "9"
 6) "8"
 7) "6"
 8) "blank2"
 9) "7"
10) "4"

smove key 目标key 值把指定值移动到另一个set中

127.0.0.1:6379> smove myset myset2 blank1
(integer) 1
127.0.0.1:6379> smove myset myset2 blank2
(integer) 1
127.0.0.1:6379> smembers myset
1) "3"
2) "1"
3) "2"
4) "9"
5) "8"
6) "6"
7) "7"
8) "4"
127.0.0.1:6379> smembers myset2
1) "blank1"
2) "blank2"

sdiff key1 key2差集

sunion key1 key2并集

sinter key1 key2交集

127.0.0.1:6379> sadd k1 a b c d
(integer) 4
127.0.0.1:6379> sadd k2 c d e f
(integer) 4
127.0.0.1:6379> sdiff k1 k2
1) "b"
2) "a"
127.0.0.1:6379> sunion k1 k2
1) "b"
2) "a"
3) "e"
4) "d"
5) "c"
6) "f"
127.0.0.1:6379> sinter k1 k2
1) "d"
2) "c"

Hash

类似一个map集合

key :<key,value> 以H开头

hset key field2 v1 field2 v2...设置hash表

hget key field获取指定的key的值

hmget key field1 field2.... 获取多个指定的值

hgetall key获取全部的值

127.0.0.1:6379> hset myhash k1 v1 k2 v2
(integer) 2
127.0.0.1:6379> hget myhash k1
"v1"
127.0.0.1:6379> hget myhash k2
"v2"
127.0.0.1:6379> hmget myhash k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379> hgetall myhash
1) "k1"
2) "v1"
3) "k2"
4) "v2"

hdel key field删除key ,对应的value也没了

hlen key获取有几个hash值

127.0.0.1:6379> hdel myhash k1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "k2"
2) "v2"
127.0.0.1:6379> hset myhash k3 v3 k4 v4
(integer) 2
127.0.0.1:6379> hgetall myhash
1) "k2"
2) "v2"
3) "k3"
4) "v3"
5) "k4"
6) "v4"
127.0.0.1:6379> hlen myhash
(integer) 3

hexists key field获取指定的field是否存在

127.0.0.1:6379> hexists myhash k2
(integer) 1
127.0.0.1:6379> hexists myhash k1
(integer) 0
127.0.0.1:6379> hexists myhash k3
(integer) 1

hkeys key获取全部field

hvals key获取全部val

hincrby key field 1自增指定增量

hsetnx key filed value不存在插入

127.0.0.1:6379> hset myhash k1 1 k2 2 k3 3 k4 4
(integer) 4
127.0.0.1:6379> hkeys myhash
1) "k1"
2) "k2"
3) "k3"
4) "k4"
127.0.0.1:6379> hvals myhash
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> hincrby myhash k1 5
(integer) 6
127.0.0.1:6379> hvals myhash
1) "6"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> hsetnx myhash k1 1
(integer) 0

存个对象

127.0.0.1:6379> hset user:1 name blank age 18 sex man
(integer) 3
127.0.0.1:6379> keys *
1) "user:1"
2) "myhash"
127.0.0.1:6379> hget user:1 name
"blank"
127.0.0.1:6379> hget user:1 ahe
(nil)
127.0.0.1:6379> hget user:1 age
"18"

Zset

有序集合

命令

zadd增加

range查看

zrangebyscore key -inf +inf从负无穷到正无穷

zrevrange key 0 -1 逆序排序

可以选择 (来表示开区间

127.0.0.1:6379> zadd myset 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zadd salary 5000 blank 1500 xiaohong 3000 zhangsan
(integer) 3
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "xiaohong"
2) "zhangsan"
3) "blank"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores 
1) "xiaohong"
2) "1500"
3) "zhangsan"
4) "3000"
5) "blank"
6) "5000"
127.0.0.1:6379> zrevrange salary 0 -1
1) "blank"
2) "zhangsan"
3) "xiaohong"
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "xiaohong"
2) "zhangsan"
3) "blank"

zrem key value移除

127.0.0.1:6379> zrem salary xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhangsan"
2) "blank"

zcount key start end后去指定区间的成员数量

127.0.0.1:6379> zrange salary 0 -1
1) "zhangsan"
2) "blank"
127.0.0.1:6379> zcount salary 0 -1
(integer) 0
127.0.0.1:6379> zcount salary 0 1
(integer) 0
127.0.0.1:6379> zcount salary 500 10000
(integer) 2

三大特殊类型

geospatial

地理位置

geoadd添加 南北极无法添加,一般直接导入 写入的数据必须符合 经度 纬度

geodist获取距离

geopos 获取指定城市的经纬度

georadius以给定的经纬度为中心找出元素

georadiusbymember以给定的城市为中心找出元素

gephash返回11个hash长度

zrange key 0 -1 基本类型都能用,查看元素

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing 121.47 31.23 shanghai 106.50 29.53 chongqing
(integer) 3
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
############################################################################################################
127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.49999767541885376"
   2) "29.52999957900659211"
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
############################################################################################################  
127.0.0.1:6379> geodist china:city beijing xian
"910056.5237"   
############################################################################################################  
127.0.0.1:6379> georadius china:city 110 30 100 km
(empty array)
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
3) 1) "shenzhen"
   2) 1) "114.04999762773513794"
      2) "22.5200000879503861"
4) 1) "hangzhou"
   2) 1) "120.1600000262260437"
      2) "30.2400003229490224"

Hyperloglog

基数—>不重复的元素

Redis 的基数统计算法

网页UV(一个人访问一个网站多次 , 但是还是算作一个人)

传统方式 : set保存用户id,然后统计set中的元素作为判断

Hyperloglog : 统计基数 , 0.81%的错误率;但是只占用12k内存

操作

pfadd添加数量

pfcount统计基数

pfmerge key [key1] [key2]将两个个key合并为新的

127.0.0.1:6379> pfadd pf1 a b c h m j k k
(integer) 1
127.0.0.1:6379> pfadd pf2 j i u y h ju g b n m g h
(integer) 1
127.0.0.1:6379> pfcount pf1
(integer) 7
127.0.0.1:6379> pfcount pf2
(integer) 10
127.0.0.1:6379> pfmerge onepf pf1 pf2
OK
127.0.0.1:6379> pfcount onepf
(integer) 13

Bitmaps

位存储

统计用户信息,登录,打卡… (某个状态)

bitmaps位图,只有0 1 两个状态

测试

setbit key value [状态]设置状态

getbit 获得状态

bitcount统计状态为1

127.0.0.1:6379> setbit daka 0 1
(integer) 0
127.0.0.1:6379> setbit daka 1 1
(integer) 0
127.0.0.1:6379> setbit daka 2 1
(integer) 0
127.0.0.1:6379> setbit daka 3 0
(integer) 0
127.0.0.1:6379> setbit daka 4 1
(integer) 0
127.0.0.1:6379> setbit daka 5 1
(integer) 0
127.0.0.1:6379> setbit daka 6 0
(integer) 0
127.0.0.1:6379> getbit daka 6
(integer) 0
127.0.0.1:6379> getbit daka 2
(integer) 1
127.0.0.1:6379> bitcount daka
(integer) 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值