redis list放入对象_Redis从入门到入土——idea连接Redis以及Redis事务与锁

Redis入门第三天:主要介绍了如何用idea连接redis、Redis事务以及Redis分布式锁的相关内容。

Redis

IDEA连接Redis

安装

  • 首先先要下载驱动包,确保下载合适的驱动包下载jar包

  • 在classpath中包含此驱动包

    image

测试连接

1import redis.clients.jedis.Jedis;

结果:

image

存储数据

 1

结果

image

Redis 事务

事务介绍

  • Redis事务是通过MULTI,EXEC,DISCARD和WATCH这四个命令来完成的

  • Redis的单个命令都是原子性的,所以这里确保事务性的对象是命令集合

  • Redis将命令集合序列化并确保处于 事务的命令集合连续且不被打断的执行

  • Redis不支持回滚的操作

相关命令

MULTI
  • 用于标记事务块的开始

  • - Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化的执行这个命令序列

EXEC
  • 在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态

DISCARD
  • 清除所有先前在一个事务中放入队列的命令,然后恢复正常连接状态

WATCH
  • 当某个事务需要按条件执行时,就需要这个命令将给定的键设置为受监控的状态

  • 语法:

  • - WATCH key [key …]

  • 可以实现Redis的乐观锁

UNWARCH
  • 清楚所有先前为一个事务监控的锁

Demo
  • 标记开始与执行

image
  • 监控
    在Redis中使用watch可以决定事务时执行还是回滚,

在MULTI 命令前使用watch监控某些键值对,然后使用multi命令开启事务,执行各类对数据结构进行操作的命令,这些命令就会进入队列

当Redis使用EXEC命令执行事务的时候,首先会去对比被watch命令所监控的键值对

发生变化就不会执行任何事务中的命令,而是去回滚事务

不发生变化就执行事务队列中的命令、提交事务

无论事务是否回滚,Redis都会去取消执行事务前的watch命令

Redis为什么不支持回滚

  • 大多数事务失败都是语法错误或者类型错误,都是可以在开发阶段进行避免的

  • Redis为了性能方面,忽略了事务回滚

Redis实现分布式锁

锁的处理

  • 单应用中使用锁:单线程多线程

  • - synchronize lock

  • 分布式应用中使用锁:多线程

分布式锁的实现方式

  • 数据库的乐观锁

  • 给予zookeeper的分布式锁

  • 给予redis的分布式锁

分布式锁的注意事项

  • 互斥性:在任意时刻,只有一个客户端能持有锁

  • 同一性:加锁和解锁必须是同一个客户端,客户端子集不能把别人加的锁给解了

  • 避免死锁:即使只有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁

实现分布式锁

获取锁
  • 方式一:使用set命令

  • - SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]

  • - - EX seconds:设置指定的到期时间 秒

    • PX milliseconds:设置指定的到期时间 毫秒

    • NX:仅在键不存在时设置键

    • XX:只有在键已存在时才设置

  • 方式二:使用setnx命令:先拿setnx来抢锁,抢到后再用expire给锁加一个过期时间防止锁忘记释放

 1
释放锁
 1

最后

  • 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持

  • 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我

  • 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。

image

你可能感兴趣的:(redis,list放入对象)