redis key命名规范_Redis几个实战经验积累
redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。
redis 和 memcached 比较
一、常规用法
这些都是非常常见的,也是使用频率比较高的一些基操
//设置一个keyredis.set(redis_key, redis_val)//获取key中的数据redis.get(redis_key)//给key添加失效redis.expire(redis_index, expire_time)//设置一个带有时效的keyredis.setex(redis_index, expire_time, redis_val);//删除keyredis.delete(redis_index)//判断key是否存在boolean is_exist = redis.exists(redis_index)//获取key的剩余生命时效redis.ttl(redis_index)
二、利用sadd和spop实现对抽奖用户的管理
实际业务场景,比如本次活动的抽奖用户,将他们的用户ID存储在set集合里面,实际抽奖时,通过spop随机弹出一名幸运儿
//通过sadd可以进行去重塞入集合中redis.sadd(redis_index , code);//设置过期时间redis.expire(redis_index, expire_time);//随机取出一个值(随机弹出一个值,并且将该值从当前集合中去除)String code = redis.spop(redis_index);//测试member是否是名称为redis_index的set的元素,有ture 没有 falseredis.sismember(redis_index, member) //返回redis_index的set的所有元素redis.smembers(redis_index)
三、利用setnx解决用户重复提交问题
实际业务场景,比如修改某一条数据,可能当前修改页面存在N个人操作,那么需要控制N个人并发点击提交按钮的问题。除了利用redis的setnx,实际上也可以通过对数据库中的数据时间戳来判断当前数据是否为最新(比如加载数据时页面存放当前加载时的时间戳,当提交到服务端时,通过查询数据获取数据库中的时间戳,对比两者是否一致)。
//标志是否可以开启事务boolean do_transaction = true;//锁标志,一般以数据ID或者用户ID组合形成唯一标志String redis_index = 'REDIS_'+data_id;//设置锁,后面的值用于后续判断锁是否过期,防止死锁发生Integer result = Redis.setnx(redis_index, time() + 50 );//如果result为1表示设置redis的key成功,可以进行事务提交if (result != 1) {Long previous_transaction_timeout = Redis.get( redis_index );//如果上次提交事务的超时时间大于当前时间,事务可能还在处理中;反之事务已经超时,造成死锁,需要重新提交事务if ( previous_transaction_timeout >= time()) {do_transaction = false;} else {Redis.delete( redis_index );result = Redis.setnx( redis_index , time() + 50 );if (result != 1) {do_transaction = false;}}}if ( !$do_transaction ) {return '您的请求太频繁啦~';}//进行事务处理
四、利用redis获取交集、并集、差集
//求并集Redis.sunion(key1, key2, …key N)//求交集Redis.sinter(key1, key2, …key N)//求差集Redis.sdiff(key1, key2, …key N)
五、不常用系列
//使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG 。//通常用于测试与服务器的连接是否仍然生效,或者用于测量延迟值。//如果连接正常就返回一个 PONG ,否则返回一个连接错误。Redis.ping()//对key进行模糊查询//这个方法虽然可以用,但是要慎用,因为查询效率会随着系统的key增加而效率骤降,极大可能影响你的代码运行Redis.keys('*o*')
======================== 补充/扩展 =========================
注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。
每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库。
这是Laravel框架下配置指定数据库的示例'redis' => ['client' => 'predis','default' => ['host' => env('REDIS_HOST', '127.0.0.1'),'password' => env('REDIS_PASSWORD', null),'port' => env('REDIS_PORT', 6379),'database' => env('REDIS_DATABASE', 0)]]
这是SpringBoot框架下配置指定数据库的示例spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=nullspring.redis.database=0
然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内存只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。
redis key命名规范_Redis几个实战经验积累相关推荐
- redis key命名规范_redis简介
key里面存储filed-value的map类型 redis数据结构 字符串类型 散列类型(Hash) 列表类型 集合类型 有序集合类型 key不要太长,最好不要超过1024个字节,但也别太短,要有一 ...
- redis key命名规范_公司内部 Redis 使用规范
前言 在业务中,会经常使用 Redis 作为后端缓存.存储.如果结构规划不合理.命令使用不规范,会造成系统性能达到瓶颈.活动高峰系统可用性下降,也会增大运维难度.为了避免出现因 Redis 使用不当, ...
- redis通过key模糊搜索_Redis几个实战经验积累
redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列 ...
- Redis的key命名规范
一.键值设计 1. key名设计 [建议]: 可读性和可管理性 1) 建议全部⼤写 2) key不能太长也不能太短,键名越长越占资源,太短可读性太差 3 ...
- 关于css命名规范一些小技巧或经验
前言 通过前边自己进行了一周自适应招聘官方网站PC端和移动端的开发,自己在开发过程中也遇到了一些css命名规范的令人头疼的事情,自己回过头来看自身的代码认真思考并总结了一些不成熟的经验,下文将向大家介 ...
- json key 命名规范_jsonapi
JSON API 规范 本文定义了一个标准的 JSON API规范,即一个应用于 Web 前后端 Ajax 数据交互规范,用以定义客户端如何获取与修改资源,以及服务器如何响应对应请求. JSON AP ...
- Redis常用命令及命名规范
redis命令用于在redis服务上执行操作,要在redis服务上执行命令,需要一个redis客户端 del key,该命令用于在key存在时删除key,可以删除多个key dump key,查看某个 ...
- cpe(通用平台枚举)命名规范及python CPE库实战
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- redis 查看key的有效期_redis key的过期时间
设置redis key的生存过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) : EXPlRE 命令用于将键key 的生存时间设置为tt ...
最新文章
- 【Java学习】从一个简单的HelloWorld项目中入门maven
- nginx相关的一些记录
- expdp备份速度慢的问题
- iOS快速集成检查更新
- 汇编 Irvine32链接库中一些过程函数的使用说明
- 【时序数据处理】pandas某些列由于n个数据导致的,通过Series生成Dataframe
- w我的页面显示服务器错误,vue项目,在本地打开一个页面正常,部署到服务器就会出现 404Not Found 求解?...
- day14内置函数作业详解
- 《现代操作系统(中文第三版)》课后习题——第六章 死锁
- WPS或Excel将姓名变为拼音
- 右键文件一直转圈卡死
- 循环群的子群必然还是循环群
- 技术问答-5 String StringBuilder StringBuffer
- 安卓APP源码和设计报告——仿淘宝水果商城
- 西门子S7-200 Smart PLC下载
- mysql返回指定时间格式_【MySQL】查询日期返回指定格式
- 树莓派连接yl-69土壤湿度传感器
- ENVI:如何进行图像融合?
- 剩余电流互感器 漏电安全监测 开口式安装 安科瑞AKH-0.66/L
- java 下载zip文件_Java以压缩包方式下载文件
热门文章
- LSTM终获「正名」,IEEE 2021神经网络先驱奖授予LSTM提出者Sepp Hochreiter
- B站学强化学习?港中文周博磊变身up主,中文课程已上线
- Redis启动服务器端和客户端的命令(redis-server、redis-cli、--help、kill、ping、切换数据库)
- 爬虫之 lxml模块的安装与使用示例
- 存储器里面的一个采用直接映射方式的32KB缓存-一个四路组相连的缓存,容量为16KB
- ACMNO.42 C语言-第几天 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。利用结构体的在最下面
- ACNO.15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再
- 基于相机和激光传感器的车顶视觉检测系统
- 【OpenCV 4开发详解】图像距离变换
- Ret2Syscall绕过NX、ASLR保护