Redis

Redis

[root@localhost bin]# redis-server config/redis.conf 
[root@localhost bin]# redis-cli -p 6379

五大数据类型

String

incr key(将 key 中储存的数字值增一)

incrby key value(将 key 所储存的值加上给定的增量值)

decr key(将 key 中储存的数字值减一)

decrby key value(key 所储存的值减去给定的减量值)

127.0.0.1:6379> set name liuyike
OK
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> keys *
1) "age"
2) "demo"
3) "name"
4) "demo1"
127.0.0.1:6379> get name
"liuyike"
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> get name
"liuyike"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> flushdb
OK

list(列表)

127.0.0.1:6379> lpush demo hello	#左侧加入
(integer) 1
127.0.0.1:6379> lpush demo hello2
(integer) 2
127.0.0.1:6379> lpush demo hello3
(integer) 3
127.0.0.1:6379> lrange demo 0 -1
1) "hello3"
2) "hello2"
3) "hello"
127.0.0.1:6379> rpush demo hello4	#右侧加入
(integer) 4
127.0.0.1:6379> lrange demo 0 -1	#按下标查看
1) "hello3"
2) "hello2"
3) "hello"
4) "hello4"
127.0.0.1:6379> lrange demo 0 0		#按下标查看
1) "hello3"
127.0.0.1:6379> rpop demo 1			#右侧移除
1) "hello4"
127.0.0.1:6379> lrange demo 0 -1
1) "hello3"
2) "hello2"
3) "hello"
127.0.0.1:6379> rpoplpush demo demo1	#将右侧移除并添加到新list中
"hello"
127.0.0.1:6379> lrange demo1 0 -1
1) "hello"
###########################################
127.0.0.1:6379> lpush list hello
(integer) 1
127.0.0.1:6379> LINSERT list before(after) hello world
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "world"
2) "hello"

set(集合 无序、不重复)

127.0.0.1:6379> sadd myset "hello"		#添加元素
(integer) 1
127.0.0.1:6379> sadd myset "word"
(integer) 1
127.0.0.1:6379> sadd myset "love"
(integer) 1
127.0.0.1:6379> keys *
1) "myset"
127.0.0.1:6379> scard myset				#获取指定set集合元素个数
(integer) 3
127.0.0.1:6379> smembers myset 			#查看指定set集合的所有值
1) "hello"
2) "word"
3) "love"
127.0.0.1:6379> sismember myset hello 	#判断某一个值是否在set集合中
(integer) 1
127.0.0.1:6379> sismember myset word 
(integer) 1
127.0.0.1:6379> sismember myset work
(integer) 0
127.0.0.1:6379> smembers myset
1) "hello"
2) "word"
3) "love"
127.0.0.1:6379> srem myset hello		#删除set集合中的指定元素
(integer) 1
127.0.0.1:6379> smembers myset 
1) "word"
2) "love"

#######################################################
# set 无序、不重复集合。抽奖!

127.0.0.1:6379> smembers myset
1) "word"
2) "love"
127.0.0.1:6379> SRANDMEMBER myset 1		#随机抽取指定个数的元素
1) "love"
127.0.0.1:6379> SRANDMEMBER myset 1
1) "word"
127.0.0.1:6379> SRANDMEMBER myset 1
1) "word"
#######################################################
# 随机移除一个元素

127.0.0.1:6379> SMEMBERS myset
1) "word"
2) "love"
127.0.0.1:6379> spop myset		#随机移除一个元素
"word"
127.0.0.1:6379> SMEMBERS myset
1) "love"
#######################################################
# 将一个指定的值,移动到另一个set集合
127.0.0.1:6379> SMEMBERS myset
1) "love"
2) "hello"
3) "world"
127.0.0.1:6379> smove myset myset2 hello 	# 将一个指定的值,移动到另一个set集合
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "love"
2) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "hello"
#######################################################
# - 差集 SDIFF
# - 交集 SINTER
# - 并集 SUNION
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SDIFF key1 key2		# 差集
1) "a"
2) "b"
127.0.0.1:6379> SINTER key1 key2	# 交集
1) "c"
127.0.0.1:6379> SUNION key1 key2	# 并集
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"

hash(key-map(key-value))

可以存储容易变更的数据,尤其是用户信息之类的,经常变动的信息。

hash更适合于对象的存储。

127.0.0.1:6379> HSET myhash field1 liuyike
(integer) 1
127.0.0.1:6379> HGET myhash field1
"liuyike"
127.0.0.1:6379> HMSET myhash field2 hello2 field3 hello3
OK
127.0.0.1:6379> HMGET myhash field1 field2 field3
1) "liuyike"
2) "hello2"
3) "hello3"
127.0.0.1:6379> HGETALL myhash		#获取
1) "field1"
2) "liuyike"
3) "field2"
4) "hello2"
5) "field3"
6) "hello3"
127.0.0.1:6379> HDEL myhash field2 	#删除hash指定key字段,对应的value也被删除
(integer) 1
127.0.0.1:6379> HGETALL myhash 
1) "field1"
2) "liuyike"
3) "field3"
4) "hello3"
127.0.0.1:6379> HLEN myhash 		# 获取hash表长度
(integer) 2
127.0.0.1:6379> HEXISTS myhash field3	#判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379> HKEYS myhash 		#获取所有字段的key值
1) "field1"
2) "field3"
127.0.0.1:6379> HVALS myhash 		#获取所有字段的map的value值
1) "liuyike"
2) "hello3"
############################################
# incr decr
127.0.0.1:6379> HSET myhash field4 5	#指定增量
(integer) 1
127.0.0.1:6379> hincrby myhash field4 2
(integer) 7
127.0.0.1:6379> hincrby myhash field4 -3
(integer) 4
127.0.0.1:6379> hsetnx myhash field5 hello5 	#如果不存在则可以设置
(integer) 1
127.0.0.1:6379> HGETALL myhash
 1) "field1"
 2) "liuyike"
 3) "field3"
 4) "hello3"
 5) "field4"
 6) "4"
 7) "field5"
 8) "hello5"
127.0.0.1:6379> hsetnx myhash field5 hello51 	#如果存在则不能设置
(integer) 0

Zset(有序集合)

127.0.0.1:6379> zadd myzset 1 one 2 two		#添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "one"
2) "two"
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 liuyike 
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf 
1) "liuyike"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores 	#升序 从无穷小到无穷大
1) "liuyike"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> zrevrangebyscore salary +inf -inf withscores 	#降序 从无穷大到无穷小
1) "zhangsan"
2) "5000"
3) "xiaohong"
4) "2500"
5) "liuyike"
6) "500"
127.0.0.1:6379> zrem salary myzset liuyike 	#删除
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xiaohong"
2) "zhangsan"
127.0.0.1:6379> zcard salary 	#获取有序集合中的个数
(integer) 2
127.0.0.1:6379> ZREVRANGE salary 0 -1	#
1) "zhangsan"
2) "xiaohong"
127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "zhangsan"
2) "xiaohong"
3) "helloworld"
127.0.0.1:6379> ZCOUNT salary -inf +inf 	#获取指定区间的个数
(integer) 3
127.0.0.1:6379> ZCOUNT salary 1 3 		#获取指定区间的个数(不包括两端)
(integer) 1

三种特殊数据类型

geospatial(地理位置Geo)

定位,打车,距离计算?

相关命令:

  1. GEOADD:添加地理位置的坐标。
  2. GEOPOS:获取地理位置的坐标。
  3. GEODIST:计算两个位置之间的距离。【GEODIST key member1 member2 [m|km|ft|mi]】
  4. GEORADIUS:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
    • GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
    • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
    • WITHCOORD: 将位置元素的经度和纬度也一并返回。
    • COUNT 限定返回的记录数。
    • ASC: 查找结果根据距离从近到远排序。
    • DESC: 查找结果根据从远到近排序。
  5. GEORADIUSBYMEMBER:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  6. GEOHASH:返回一个或多个位置对象的 geohash 值。
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
redis> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"

redis> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"

Hyperloglog(基数)

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

HyperLogLog 的工作过程:

redis 127.0.0.1:6379> PFADD mykey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD mykey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD mykey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT mykey
(integer) 3

Bitmaps

位存储 只有"0"和"1"

统计用户信息,活跃 不活跃;登录 未登录;打卡 未打卡;两个状态的,都可以使用Bitmaps!

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 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> GETBIT sign 2 
(integer) 1
127.0.0.1:6379> GETBIT sign 4 
(integer) 0
###########################################
# 统计
127.0.0.1:6379> BITCOUNT sign 
(integer) 3

事务

Redis单条命令是保证原子性的,但是事务不保证原子性!

redis事务没有隔离级别的概念!

redis事务本质:一组命令的集合!一个事务中所有的命令都会被序列化,在事务执行过程中,会按照顺序执行!

一次性、顺序性、排他性。

redis事务:

  • 开启事务(multi)

  • 命令入队

  • 执行事务(exec)

  • 取消事务(discard)(取消事务,放弃执行事务块内的所有命令。)

# 如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

编译型异常

代码有错误,命令有错误,事务中所有的命令都不会被执行

运行时异常

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incr k1 
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec
1) (error) ERR value is not an integer or out of range
2) OK
3) OK

监控 Watch

悲观锁

认为什么时候都会出问题,无论做什么操作都会加锁。

乐观锁

认为什么时候都不会出问题,无论做什么操作都不会加锁。

更新数据的时候去判断一下,在此期间是否有人修改过这个数据。

  1. 获取version

  2. 更新的时候比较version

正常执行成功!

127.0.0.1:6379> set money 100 
OK
127.0.0.1:6379> set out 0 
OK
127.0.0.1:6379> watch money 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> DECRBY money 20 
QUEUED
127.0.0.1:6379(TX)> INCRBY out 20 
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 80
2) (integer) 20

测试多线程修改值,使用watch作乐观锁操作!

127.0.0.1:6379> get money
"1000"
127.0.0.1:6379> watch money 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> DECRBY money 20
QUEUED
127.0.0.1:6379(TX)> INCRBY out 20
QUEUED
127.0.0.1:6379(TX)> exec
(nil)

Jedis

SpringBoot整合

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值