当前位置: 首页 > article >正文

redis使用

  • 一、连接
  • 二、类型讲解
    • 1、String
    • 2、List
    • 3、Set
    • 4、Zset
    • 5、Hash
    • 6、Hyperloglog
    • 7、Bitmaps
  • 三、事务
    • 1、使用事务
    • 2、注意点
  • 四、实现乐观锁

redis 命令大全:http://www.redis.cn/commands.html

一、连接

redis-cli -h IP -p PORT -a PASSWORD

# 查看redis信息
info server

二、类型讲解

1、String

# 设置值
set KEY VALUE 
mset KEY1 VALUE1 KEY2 VALUE2 KEY3 VALUE3
getset KEY VALUE  # 先get值 再set新值
# 设置KEY值SEXONDS秒后过期
setex KEY SEXONDS VALUE
# 如果key不存在,则创建;若存在,则创建失败
setnx KEY VALUE

# 删除值
del KEY1 KEY3 KEY3

# 移动值
move KEY VALUE BD

# 获取值
get KEY1
mget KEY1 KEY3 KEY3
# 判断值是否存在
exists KEY

在这里插入图片描述

# 追加值 若key不存在则新增key
append KEY VALUE

在这里插入图片描述

# 值加一
incr KEY
# 值减一
decr KEY
# 值加/减x
incrby KEY X
decrby KEY X

在这里插入图片描述

# 取值的x-y值
getrange KEY X Y
# 将key位置x开始的值替换为NEWVALUE
setrange KEY X NEWVALUE

用例

set user:mapyking:follow 0

设置计算粉丝数,关注即+1

2、List

# 添加VALUE到列表头部/尾部
lpush/rpush LISTKEY VALUE1 VALUE2 VALUE3
# 在VALUE1值前/后加入VALUE2
Linsert LISTKEY before/after VALUE1 VALUE2
# 替换INDEX位置值为value
lset LISTKEY INDEX VALUE

# 获取列表值
lrange LISTKEY START STOP
lindex LISTKEY INDEX

# 从头部/尾部删除值
lpop/rpop LISTKEY 
# 移除count个数的指定value值 
Lrem LISTKEY count value
# 移动列表1最后一个元素到列表2
rpoplpush LISTKEY LISTKEY2


# 返回列表长度
Llen LISTKEY 

3、Set

# 往set中添加member1 
sadd KEY member1 [member2]
# 删除
srem KEY member1  # 随机删除一个 spop KEY
# 查看set所有值
smembers KEY 
# 查看元素个数
scard KEY
# 将member1移动到另外一个set中
smove set1 set2 memberx

# 判断member是否存在set中
sismember KEY member1 


# 随机从key中抽取x个元素
SRANDMEMBER KEY x

在这里插入图片描述

4、Zset

有序集合

# 添加值
zadd key score member score2 member2 [score3 member3]

# 查看值
zrange key 0 -1

# 排序查看
ZRANGEBYSCORE key min max withscores # 从小到大
ZREVRANGE key star stop withscores # 从大到小

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#删除元素
zrem key member [member2 ...]

# 获取指定区间的元素
zcount key source1 source2

5、Hash

key-value -> key-map -> key-(key-value)

# 设置值
hset key field value [field2 value2 ...]
# 查看值
hget key field
# 查看所有key/value
hkeys/hvals key

# 
hmset key field1 value1 field2 value2 [field3 value3 ...]
#
hmget key field1 field2 
hgetall key 


# 删除值,field对应value也一起删除
hdel key field

在这里插入图片描述

6、Hyperloglog

优点:HyperLogLog 的优点在于它所需的内存并不会因为集合的大小而改变,无论集合包含的元素有多少个,HyperLogLog 进行计算所需的内存总是固定的,并且是非常少的。 每个 HyperLogLog 最多只需要花费12KB 内存,在标准误差 0.81% 的前提下,就可以计算2 的64 次方个元素的基数。

# 创建一组元素
PFadd key value1 [value2 value3...]

# 统计key元素个数
PFcount key

# 求并集
PFmerge newkey3 key1 key2

7、Bitmaps

操作二进制位来记录
例如:员工打卡、活跃度

# 设置值
setbit key offset value

# 查看值
getbit key offset

例如员工打卡 1-30天 0为未打卡 1为已打卡
setbit daka 0 1
setbit daka 1 1
setbit daka 2 1
setbit daka 3 0
setbit daka 4 1

# 统计员工打卡天数
bitcount daka

三、事务

redis中单条命令保证原子性,但是事务(一组命令的集合)不保证原子性

1、使用事务

① 开启事务

multi

② 进入队列
输入redis命令

set keyA 111
set keyB 111
set keyC 222

get keyA 
set keyD 12345

③ 执行

exec

在这里插入图片描述

2、注意点

① 放弃事务

# 放弃事务
discard

② 命令语法错误
事务中,命令语法有报错,则整个事务不会被执行
在这里插入图片描述
③ 运行时错误
命令语法没问题,但是运行时出现问题,事务可被执行,有问题的语句跳过
在这里插入图片描述

四、实现乐观锁

悲观锁和乐观锁是并发控制中常用的两种策略。

悲观锁假设在数据访问过程中会发生冲突,因此在访问数据之前就会对其进行加锁,以防止其他事务对其进行修改。悲观锁通常使用数据库锁机制来实现,例如在读取数据时使用共享锁(Shared Lock),在修改数据时使用排他锁(Exclusive Lock)。悲观锁的特点是在整个事务过程中保持数据的独占性,但可能会导致并发性能下降。

乐观锁则假设在数据访问过程中不会发生冲突,因此不会立即对数据进行加锁。相反,它在更新数据时会检查是否有其他事务对其进行了修改。乐观锁通常使用版本号或时间戳等机制来实现。当检测到冲突时,乐观锁会中止当前操作,让应用程序重新尝试。乐观锁的特点是在大部分时间内不需要加锁,因此并发性能较高,但需要处理冲突的情况。

选择使用悲观锁还是乐观锁取决于具体的应用场景和需求。如果冲突的概率较高或对数据的独占性要求较高,可以选择悲观锁。如果冲突的概率较低且并发性能较为重要,可以选择乐观锁。

① watch监视
② 执行事务

set money 100
set cost 0
watch money # 设置监控,事务执行成功后 监控会取消

MULTI
decrby money 30
incrby cost 30
exec

在这里插入图片描述
单线程运行没有问题,但是多线程则不会执行
例如:
机器二 已经在watch中在这里插入图片描述
机器一修改key
在这里插入图片描述

机器二 exec执行刚刚watch中的事务,则不会执行成功

在这里插入图片描述

解决办法:先解锁 再加锁

unwatch

watch

http://www.kler.cn/a/149582.html

相关文章:

  • 【专题】计算机网络之网络层
  • 用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能
  • 【Linux】TCP原理
  • MySQ怎么使用语法介绍(详细)
  • Android 下内联汇编,Android Studio 汇编开发
  • 设计模式——策略模式(c++)
  • “rhdf5filters.so’ not found when install ‘glmGamPoi‘ package
  • AUTOSAR系统服务篇 - BswM
  • RPG项目01_UI登录
  • 如何在 Vim 中剪切、复制和粘贴
  • leetcode 打家劫舍
  • [栈溢出+参数跟踪] [ZJCTF 2019]Login
  • 【LeetCode】挑战100天 Day13(热题+面试经典150题)
  • Excel导入组件的封装以及使用页面点击弹出该弹框
  • Nature子刊最新研究:Hi-C宏基因组揭示土壤-噬菌体-宿主相互作用
  • Django请求生命周期流程
  • Android WiFi的断开分析
  • ChatGPT到底是如何运作?
  • 水淹七军(递归,又是递归)
  • 【Unity记录】EDM4U(External Dependency Manager)使用说明
  • temu反洗钱协议在哪里签署
  • HashMap源码解析
  • 批量采集淘宝商品数据,有哪些方式可以实现?
  • 【Spark源码分析】事件总线机制分析
  • Python超级详细的变量命名规则
  • uniApp应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准。