redis-jedis笔记整理
redis常用命令总结
redis常用命令总结Redis是一个开源的内存数据结构存储系统,它通过提供多种不同的数据结构,如字符串、列表、哈希表、集合、有序集合等,来支持各种不同的应用场景。
Redis提供了丰富的命令集,下面是常用的一些Redis命令总结。
1. 键操作命令:- SET key value:设置键的值- GET key:获取键的值- DEL key:删除键- EXISTS key:判断键是否存在- KEYS pattern:查找符合指定模式的键- TTL key:获取键的剩余生存时间2. 列表操作命令:- LPUSH key value:将值插入到列表的头部- RPUSH key value:将值插入到列表的尾部- LPOP key:移除并返回列表的头部元素- RPOP key:移除并返回列表的尾部元素- LLEN key:获取列表的长度- LRANGE key start stop:获取列表指定范围的元素3. 哈希表操作命令:- HSET key field value:设置哈希表指定字段的值- HGET key field:获取哈希表指定字段的值- HGETALL key:获取哈希表的所有字段和值- HDEL key field:删除哈希表指定字段- HKEYS key:获取哈希表的所有字段4. 集合操作命令:- SADD key member:向集合添加元素- SREM key member:从集合移除元素- SMEMBERS key:获取集合的所有元素- SCARD key:获取集合的元素个数- SINTER key1 key2:求交集5. 有序集合操作命令:- ZADD key score member:向有序集合添加元素及其分数 - ZREM key member:从有序集合移除元素- ZRANGE key start stop:获取有序集合指定范围的元素 - ZRANK key member:获取有序集合中元素的排名- ZCARD key:获取有序集合的元素个数6. 过期键操作命令:- EXPIRE key seconds:为键设置过期时间- PERSIST key:移除键的过期时间- TTL key:获取键的剩余生存时间7. 数据持久化命令:- SAVE:将数据同步保存到磁盘- BGSAVE:在后台异步保存数据到磁盘- LASTSAVE:获取最近一次成功保存数据的时间8. 事务命令:- MULTI:开启事务- EXEC:执行事务中的所有命令- DISCARD:取消事务,放弃执行事务中的所有命令9. 订阅与发布命令:- SUBSCRIBE channel:订阅指定的频道- UNSUBSCRIBE [channel]:取消订阅指定的频道- PUBLISH channel message:向指定频道发布消息10. 其他命令:- APPEND key value:在字符串末尾追加值- INCR key:将键的值增加1- DECR key:将键的值减少1- INCRBY key increment:将键的值增加指定的数值- DECRBY key decrement:将键的值减少指定的数值以上是Redis的一些常用命令,通过这些命令,可以实现对键值对、列表、哈希表、集合、有序集合等数据结构的操作,并且支持事务、订阅与发布等高级功能。
尚硅谷Redis学习笔记(6)--Redis主从复制
尚硅⾕Redis学习笔记(6)--Redis主从复制1.是什么主机数据更新后根据配置和策略,⾃动同步到备机的master/slaver机制,Master以写为主,Slave以读为主2.能⼲嘛读写分离,性能扩展容灾快速恢复3.具体操作:主从复制1、创建myredis⽂件夹2、复制redis.conf配置⽂件到⽂件夹中3、配置⼀主多从,创建三个配置⽂件创建新的配置⽂件:redis6379.conf,redis6380.conf,redis6381.conf3.1 新建redis6379.conf,填写以下内容include /myredis/redis.confpidfile /var/run/redis_6379.pidport 6379dbfilename dump6379.rd在myredis⽂件夹下⾯的⽂件3.2 新建redis6380.conf,填写以下内容3.3 新建redis6381.conf,填写以下内容slave-priority 10设置从机的优先级,值越⼩,优先级越⾼,⽤于选举主机时使⽤。
默认1003.4 启动三台Redis服务器3.5 查看系统进程,看看三台服务器是否启动3.6 查看三台主机运⾏情况info replication打印主从复制的相关信息三台都显⽰⾃⼰是主机,没有从机3.7 配从(库)不配主(库)slaveof ip port成为某个实例的从服务器1. 在6380和6381上执⾏: slaveof 127.0.0.1 6379role的⾓⾊变成slave从机,master_host, master_port等等是主机信息主服务器信息connected_slaves连接两台从机2. 在主机上写,在从机上可以读取数据在从机上写数据报错3. 主机挂掉,重启就⾏,⼀切如初4. 从机重启需重设:slaveof 127.0.0.1 6379可以将配置增加到⽂件中。
永久⽣效。
jedis笔记
jedis.srem(key,value)删除set指定项数据;
Set<String> values=jedis.smembers(key)获取set中所有元素
String value=jedis.spop(key)弹出数据随机弹出
字符串操作
保存字符串key-value类型数据.默认保存的数据会永久的保存在磁盘上,数据不会丢失
jedis.set(key,value)//根据key如果不存在就新增反之存在key就覆盖,保存新值
jedis.setex(key,time,value)//保存数据并指定过期时间time单位秒
}
Boolean hexists=jedis.hexists(key,value);判断是否存在
Set<String> hkeys = jedis.hkeys(key) 获取所有键值
List<String> hvalus=jedis.hvals(key)获取key的所有值
Long hlen=jedis.hlen(key) 获取map个数
jedis.mget(key1,key2,...)取出多个key的value返回list
jedis.del(key1,key2,....)删除key-value
boolean exists=jedis.exists(key)//判断key是否存在
{
jedis.select(0)
sortingParams.get("#");获取排序元素自身的值
sortingParams.get("user:*");
Redis笔记-阿里推荐Redis使用规范
Redis笔记-阿⾥推荐Redis使⽤规范
key名设计:
规范化,以数据库名为前缀,防⽌key冲突,⽤冒号分隔,如下:(数据库名:表名:ID)
tlz:order:1
简洁性,保证语义的前提下,控制key的长度,应该使⽤简写
不要包含特殊字符,不要包含空格、换⾏、单双引号以及其他符号
value设计:
拒绝bigkey,防⽌慢查询,string类型控制在10k以内,hash、lish、set、zset元素个数不要超过5000
控制key的声明周期:
建议使⽤expire设置过期时间,尽量打散过期时间,不要集中过期
禁⽤命令:
禁⽌线上使⽤keys、flushall、flushdb等,通过redis的rename机制禁掉命令,或者使⽤scan的⽅式渐进式处理。
因为redis是单线程执⾏,容易导致线上不可⽤.
scan命令是通过游标分步进⾏,不会阻塞线程,提供count参数,不是结果数量,是Redis单次遍历字典数量,同keys⼀样也提供模式匹配功能。
scan 0 match user_token* count 5 #从0开始遍历,返回新游标,下次查询从新游标开始遍历
合理使⽤select:
redis的多数据库较弱,使⽤数字进⾏区分,很多客户端⽀持较差,同时多业务⽤多数据库实际还是单线程处理,会有⼲扰
尽量使⽤批量操作提⾼效率:
原⽣命令:例如mget、mset;⾮原⽣命令:可以使⽤pipeline提⾼效率。
但要注意控制⼀次批量操作的元素个数(例如500以内,实际也和元素字节数有关)。
redis(三)积累-基本的取值和设值
redis(三)积累-基本的取值和设值1. 先把redis的连接池拿出来,JedisPool pool=new JedisPool(new JedisPoolConfig(),"127.0.0.1")Jedis jedis=pool.getResource();2.设值: jedis.set("key1","value1");取值: jedis.get("key1");删除: jedis.del("key1");给⼀个key叠加value: jedis.append("key1","value2");--------key1对应的就是 value1value2同时给两个key赋值:jedis.mset("key1","value1","key2","value2");------ key1对应的就是value13.对Map进⾏操作:Map<String,String> user=new HashMap();user.put("key1","value1");user.put("key2","value2");user.put("key3","value3");放⼊: jedis.hmset(“user”,user);取出 user中的key1 List<String> nameMap= jedis.hmget("user","key1");删除其中⼀个键值:jedis.hdel("user","key2");是否存在⼀个键:jedis.exists("user");取出所有的Map中的值:Iterator<String> iter=jedis.hkeys("user").iterator();while(iter.next()){ jedis.hmget("user", iter.next() ) }。
redis知识点总结
redis知识点总结Redis知识点总结Redis是一种高性能的键值存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。
Redis的特点是速度快、可靠性高、支持多种数据结构和丰富的功能。
本文将对Redis的一些重要知识点进行总结。
1. Redis的数据结构Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。
其中,字符串是最基本的数据结构,可以存储任何类型的数据,包括数字、文本、二进制数据等。
哈希表是一种键值对的集合,可以存储多个字段和对应的值。
列表是一种有序的字符串集合,支持在列表的两端插入和删除元素。
集合是一种无序的字符串集合,支持集合的交、并、差等操作。
有序集合是一种有序的字符串集合,每个元素都有一个分数,可以根据分数进行排序。
2. Redis的持久化Redis支持两种持久化方式:RDB和AOF。
RDB是一种快照方式,可以将Redis的数据保存到磁盘上,以便在Redis重启时恢复数据。
AOF是一种追加方式,可以将Redis的操作记录保存到磁盘上,以便在Redis重启时重新执行操作记录来恢复数据。
RDB的优点是快速、简单,缺点是可能会丢失一部分数据;AOF的优点是可靠、安全,缺点是性能较低。
3. Redis的主从复制Redis支持主从复制,可以将一个Redis实例的数据复制到多个Redis实例上。
主从复制的作用是提高Redis的可用性和性能。
主Redis实例负责写入数据,从Redis实例负责读取数据。
当主Redis 实例出现故障时,从Redis实例可以接管主Redis实例的工作,保证Redis的可用性。
主从复制的配置比较简单,只需要在从Redis 实例上配置主Redis实例的IP地址和端口号即可。
4. Redis的事务Redis支持事务,可以将多个命令打包成一个事务,然后一次性执行。
事务的作用是保证多个命令的原子性,即要么全部执行成功,要么全部执行失败。
Redis的事务使用MULTI、EXEC、DISCARD和WATCH等命令实现。
java redis 知识点
java redis 知识点Redis是一种高性能的非关系型内存数据库,它可以用来存储和访问数据。
Redis 能够运行在多种操作系统上,也能够与多种编程语言进行交互。
在 Java 中,我们可以使用 Jedis 这个 Java Redis 客户端来与 Redis 进行交互。
在本文中,我们将介绍 Java Redis 的一些基础知识和常用操作,以便您能够更好地了解和使用 Redis。
1. 连接 Redis在 Java 中,我们可以使用 Jedis 来连接 Redis。
Jedis 是Redis 的 Java 客户端,它提供了一些简单易用的 API,可以方便地与 Redis 进行交互。
下面是连接 Redis 的示例代码:```Jedis jedis = new Jedis('localhost', 6379);jedis.auth('password');```在这个示例中,我们首先创建了一个 Jedis 对象,并指定了Redis 服务器的地址和端口号。
接着,我们使用 auth() 方法来进行身份验证,以确保只有授权用户才能访问 Redis。
2. 存储数据Redis 是一种键值存储数据库,它将数据存储为键值对的形式。
在 Java 中,我们可以使用 Jedis 来存储数据。
下面是存储数据的示例代码:```jedis.set('key', 'value');```在这个示例中,我们使用 set() 方法来存储一个键值对。
其中,第一个参数是键,第二个参数是值。
3. 获取数据在 Java 中,我们可以使用 Jedis 来获取存储在 Redis 中的数据。
下面是获取数据的示例代码:```String value = jedis.get('key');```在这个示例中,我们使用 get() 方法来获取键为 'key' 的值。
Redis学习笔记
Redis学习手册文中的内容和数据主要来自于Redis官方文档,作者仅仅是根据自己的经验对常用的内容做了进一步的解释和归纳。
有兴趣的网友也可以直接阅读Redis的官方文档。
由于作者的翻译和理解能力有限,如有不到之处,欢迎指正。
最后需要说的是,如果这个系列的博客能够让您在阅读后有所收获,那么就请继续关注作者后面有关新主题的系列博客。
目录PHP学习手册 (1)Redis学习手册(开篇) (3)一、简介: (3)二、Redis的优势: (3)三、目前版本中Redis存在的主要问题: (4)四、和关系型数据库的比较: (4)五、如何持久化内存数据: (4)Redis学习手册(String数据类型) (5)一、概述: (5)二、相关命令列表: (5)三、命令示例: (8)Redis学习手册(List数据类型) (14)一、概述: (14)二、相关命令列表: (14)三、命令示例: (17)四、链表结构的小技巧: (21)Redis学习手册(Set数据类型) (22)一、概述: (22)二、相关命令列表: (22)三、命令示例: (24)四、应用范围: (27)Redis学习手册(Hashes数据类型) (28)一、概述: (28)二、相关命令列表: (28)三、命令示例: (30)Redis学习手册(Sorted-sets数据类型) (32)一、概述: (32)二、相关命令列表: (32)三、命令示例: (36)四、应用范围: (39)Redis学习手册(Key操作命令) (39)一、概述: (39)二、相关命令列表: (39)三、命令示例: (42)Redis学习手册(事物) (45)一、概述: (45)二、相关命令列表: (46)三、命令示例: (47)四、WATCH命令和基于CAS的乐观锁: (48)Redis学习手册(主从复制) (49)一、Redis的Replication: (49)二、Replication的工作原理: (50)三、如何配置Replication: (50)四、应用示例: (50)Redis学习手册(持久化) (52)一、Redis提供了哪些持久化机制: (52)二、RDB机制的优势和劣势: (52)三、AOF机制的优势和劣势: (52)四、其它: (53)Redis学习手册(虚拟内存) (54)一、简介: (54)二、应用场景: (54)三、配置: (55)Redis学习手册(管线) (56)一、请求应答协议和RTT: (56)二、管线(pipelining): (56)三、Benchmark: (57)Redis学习手册(服务器管理) (58)一、概述: (58)二、相关命令列表: (58)Redis学习手册(内存优化) (61)一、特殊编码: (61)二、BIT和Byte级别的操作: (61)三、尽可能使用Hash: (61)Redis学习手册(实例代码) (62)Redis学习手册(开篇)一、简介:在过去的几年中,NoSQL数据库一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。
redis知识点
redis知识点Redis是一个高性能的键值存储系统,它支持多种数据结构,包括字符串、哈希、列表、集合和有序集合。
Redis还提供了一些高级特性,如发布/订阅、事务和 Lua 脚本执行等。
Redis是一个非常流行的开源项目,被广泛应用于Web应用程序、数据缓存、消息队列和实时分析等领域。
本文将介绍Redis的一些重要知识点,包括数据类型、命令、性能优化和集群部署等。
一、Redis数据类型1.字符串(String)字符串是Redis最基本的数据类型,它可以存储任何类型的数据,包括文本、数字和二进制数据。
Redis的字符串有一些特殊的操作,如自增、自减、追加、截取和位操作等。
字符串通常用于缓存数据、计数器、分布式锁等场景。
2.哈希(Hash)哈希是一种类似于字典的数据结构,它存储了多个键值对,并且可以嵌套。
哈希通常用于存储对象,比如用户信息、商品信息等。
Redis 提供了一系列哈希操作,如设置、获取、删除、批量设置和获取等。
3.列表(List)列表是一种有序的数据结构,它可以存储多个元素,并且支持在两端进行插入和删除操作。
列表通常用于队列、栈和排行榜等场景。
Redis提供了一系列列表操作,如插入、删除、获取、修剪、阻塞等。
4.集合(Set)集合是一种无序的数据结构,它可以存储多个元素,并且支持集合运算,如交集、并集和差集等。
集合通常用于去重、好友关系、投票和标签等场景。
Redis提供了一系列集合操作,如添加、删除、获取、判断、运算等。
5.有序集合(Sorted Set)有序集合是一种有序的数据结构,它可以存储多个元素,并且每个元素都有一个分数,分数用于排序。
有序集合通常用于排行榜、计数器和范围查询等场景。
Redis提供了一系列有序集合操作,如添加、删除、获取、范围查询等。
二、Redis命令Redis的命令非常丰富,可以满足各种数据操作需求。
下面列举一些常用的命令:1.字符串操作- SET key value:设置键值对- GET key:获取键值对- INCR key:自增1- DECR key:自减1- APPEND key value:追加字符串- GETRANGE key start end:获取子字符串- BITOP operation destkey key [key ...]:位运算2.哈希操作- HSET key field value:设置哈希字段- HGET key field:获取哈希字段- HDEL key field [field ...]:删除哈希字段- HGETALL key:获取所有哈希字段- HINCRBY key field increment:哈希字段自增3.列表操作- LPUSH key value [value ...]:从左边插入元素- RPUSH key value [value ...]:从右边插入元素- LPOP key:从左边删除元素- RPOP key:从右边删除元素- LINDEX key index:获取指定位置元素- LLEN key:获取列表长度4.集合操作- SADD key member [member ...]:添加集合元素- SMEMBERS key:获取集合所有元素- SREM key member [member ...]:删除集合元素- SISMEMBER key member:判断元素是否在集合中- SINTER key [key ...]:求多个集合的交集5.有序集合操作- ZADD key score member [score member ...]:添加有序集合元素- ZRANGE key start stop [WITHSCORES]:获取有序集合指定范围元素- ZREM key member [member ...]:删除有序集合元素- ZSCORE key member:获取有序集合元素分数- ZRANK key member:获取有序集合元素排名三、Redis性能优化Redis的性能优化是非常重要的,下面列举一些常用的优化技巧: 1.使用持久化Redis支持两种持久化方式,分别是RDB和AOF。
jedis 用法
Jedis用法详解一、简介Jedis是Redis的Java驱动,提供了与Redis服务器进行交互的方法。
Jedis具有丰富的API,支持大部分Redis命令,并且提供了连接池功能,可以有效地提高程序性能。
本文将详细介绍Jedis的基本用法,包括连接Redis服务器、执行命令、操作数据等。
二、安装Jedis在项目中使用Jedis,首先需要将其添加到项目的依赖中。
如果使用Maven,可以在pom.xml文件中添加以下依赖:<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>三、连接Redis服务器1. 创建Jedis对象:使用Jedis构造函数创建Jedis对象,传入Redis服务器的地址和端口号。
import redis.clients.jedis.Jedis;public class JedisDemo {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);}}2. 连接到Redis服务器:调用Jedis对象的connect方法连接到Redis服务器。
jedis.connect();3. 检查连接状态:调用Jedis对象的ping方法检查与Redis服务器的连接状态。
boolean isConnected = jedis.ping();System.out.println("Connection status: " + isConnected);四、执行命令1. 设置键值对:调用Jedis对象的set方法设置键值对。
redis知识点笔记总结
redis知识点笔记总结一、Redis简介Redis是一款开源的高性能键值存储数据库,它使用ANSI C语言编写,并且支持多种数据结构,包括字符串、列表、集合、有序集合、哈希表等。
Redis的特点包括:持久化,高性能,支持丰富的数据结构,支持事务,支持发布订阅,支持主从复制等。
Redis可以用于缓存、消息队列、计数器、排行榜等各种场景。
二、数据结构1. 字符串字符串是Redis最基本的数据类型,它可以存储任意类型的数据,比如整数、浮点数、二进制数据等。
Redis提供了一系列操作字符串的命令,比如set、get、incr、decr等。
字符串的最大长度为512MB。
2. 列表列表是一种有序的、可以重复的数据结构,它可以存储字符串、整数、浮点数等各种类型的元素。
Redis提供了一系列操作列表的命令,比如lpush、rpush、lpop、rpop等。
3. 集合集合是一种无序的、不重复的数据结构,它可以存储字符串、整数、浮点数等各种类型的元素。
Redis提供了一系列操作集合的命令,比如sadd、srem、smembers、sinter等。
4. 有序集合有序集合是一种有序的、不重复的数据结构,它可以存储字符串、整数、浮点数等各种类型的元素,并且每个元素都有一个分数。
Redis提供了一系列操作有序集合的命令,比如zadd、zrem、zrangebyscore、zrevrange等。
5. 哈希表哈希表是一种键值对集合,它可以存储字符串、整数、浮点数等各种类型的值。
Redis提供了一系列操作哈希表的命令,比如hset、hget、hdel、hgetall等。
三、持久化Redis支持两种持久化方式:RDB(快照)和AOF(日志)。
RDB是通过将内存中的数据写入磁盘生成一个快照文件,用于备份和恢复数据。
AOF是通过将写命令追加到一个日志文件中,用于恢复数据。
用户可以根据需求选择合适的持久化方式,或者同时使用RDB 和AOF。
java操作redis基础知识
Redis基础知识一、对比Nosql与sqlSql:关系型数据库结构化(Structured)->字段有约束,约定好结构就好了,表变了业务也可能变。
关联的->如用户表、商品表、订单表。
查询:查询语法。
(格式与语法固定)。
事务:原子性、一致性等事务。
(ACID)存储:磁盘。
(存储在本机,数据量大只能提升电脑性能)扩展性:垂直。
使用场景:数据结构固定;相关业务对数据安全性、一致性要求较高。
Nosql:非关系型数据库非结构-> 有键值对形式,有文档形式(字段没有约束)。
非关联->可以将用户表、商品表、订单表存在json中,缺点就是重复。
没有规定查询语句(get user:1)。
事务:无法全部满足ACID事务。
(BASE)存储:内存。
扩展性:水平。
使用场景:数据结构不固定;对一致性、安全性要求高;对性能要求。
二、认识redis特征:键值型:value支持多重不同数据结构,功能丰富。
单线程:每个命令具备原子性。
(6.0对网络请求是多线程,核心是单线程)低延迟,速度快(基于内存、IO多路复用,良好的编码)。
支持数据持久化。
(定期将数据存在内存中,以防止断点,丢失数据)支持主从集群、分片集群。
(从节点可以备份主节点防止一个节点坏了可以从另外一个节点中获取)(分片是将1T内存存在多个机器中)支持多语言客户端三、安装Redis官网下载地址:打开redis:启动redis-server.exe默认开启端口号:6379Wins启动cli:redis-cli.exe -h 127.0.0.1 -p 6379四、Redis命令行客户端redis-cli [options] [commonds]如:-h 127.0.0.1 指定要链接的redis节点的ip地址,默认是127.0.0.1-p 6379 :指定redis节点的端口,默认是6379.-a 123321 :指定redis的访问密码。
五、图形化桌面客户端:redis默认是16个库。
redis笔记总结之redis数据类型及常用命令
redis笔记总结之redis数据类型及常⽤命令三、常⽤命令 3.1 字符串类型(string) 字符串类型是Redis中最基本的数据类型,⼀个字符串类型的键允许存储的数据的最⼤容量为512MB。
3.1.1 赋值与取值: SET key value GET key 3.1.2 递增数字: INCR key //每执⾏⼀次递增1 INCRBY key num //每执⾏⼀次递增num 需注意的是如果多个客户端同时连接⼀个Redis时存在同时操作同⼀个key的隐患,将在事务讲解原⼦性。
适⽤事例:⽂章统计量访问;⽣成⾃增ID;存储⽂章数据。
3.1.3 递减数字 DECR key //每执⾏⼀次递减1 DECRBY key num //每执⾏⼀次递减num 3.1.4 增加指定浮点数 INCRBYFLOAT key num 3.1.5 向尾部增加值 APPEND key value 3.1.6 获取字符串长度 STRLEN key //每个汉字占⽤3个长度 3.1.7 同时设置/获取多个键值 MSET key1 value1 key2 value2 ... MGET key1 key2 .... 3.2 散列类型(hash) 散列类型的字段值只能是字符串,包括不能嵌套其他的数据类型,其他的Redis数据类型也是不能嵌套 散列类型适合存储对象:使⽤对象类别和ID构成键名,使⽤字段表⽰对象的属性,字段值存储属性值,如图所⽰: 3.2.1 赋值与取值 HSET key field value //设置对象单⼀属性值 HGET key field //获取对象单⼀属性值 HMSET key field1 value1 field2 value2 ... //设置对象多个属性值 HMGET key field1 field2 ... //获取对象多个属性值 HGETALL key //获取对象所有的键值 说明:HSET不区分是更新操作还是插⼊操作,当键不存在时,执⾏的是插⼊操作,返回的是1;当键存在时,执⾏更新操作,返回0。
7000字Redis超详细总结笔记总收藏必备!
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库Redis 与其他 key - value 缓存产品有以下三个特点:•Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
•Redis 不仅仅支持简单的 key - value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储•Redis 支持数据的备份,即 master - slave 模式的数据备份•性能极高– Redis 读的速度是 110000 次 /s, 写的速度是 81000 次 /s 。
•丰富的数据类型 - Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及Ordered Sets 数据类型操作。
•原子性 - Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。
单个操作是原子性的。
多个操作也支持事务,即原子性,通过MULTI 和 EXEC 指令包起来。
•其他特性 - Redis 还支持 publish/subscribe 通知,key 过期等特性。
Redis 支持 5 中数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)stringstring 是 redis 最基本的数据类型。
一个 key 对应一个 value。
string 是二进制安全的。
也就是说 redis 的 string 可以包含任何数据。
比如 jpg 图片或者序列化的对象。
string 类型是 redis 最基本的数据类型,string 类型的值最大能存储 512 MB。
理解:string 就像是 java 中的 map 一样,一个 key 对应一个 value127.0.0.1:6379> set hello worldOK127.0.0.1:6379> get hello"world"hashRedis hash 是一个键值对(key - value)集合。
Jedis操作redis看这一篇就够了
Jedis操作redis看这⼀篇就够了上⼀篇讲到了redis的常⽤操作命令,这次我们通过Jedis这个⼯具类来操作redis需要⽤到的包,在maven中引⼊<!--阿⾥巴巴的json⼯具--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.13</version></dependency><!--Jedis⼯具--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>下⾯是操作代码:注意:User类⾃⼰编⼀个吧。
package com.ben;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import er;import redis.clients.jedis.BinaryClient;import redis.clients.jedis.Jedis;import redis.clients.jedis.Tuple;/*** @ClassName: JedisTests* @author: benjamin* @version: 1.0* @description: TODO* @createTime: 2019/08/22/16:13*/public class JedisTests {public static void main(String[] args) {// 填⾃⼰redis服务器的IP和端⼝// 格式:redis://ip:6379/要⽤的redis数据库Jedis jedis = new Jedis("redis://192.168.214.128:6379/2");jedis.flushDB();// set getjedis.set("name","benjie");print(1,jedis.get("name"));// 重命名keyjedis.rename("name", "ben");//print(1, jedis.get("name")); // 报错print(1, jedis.get("ben"));// 设置键值及过期时间,以秒为单位jedis.setex("hello2", 3, "world");// ⾃增jedis.set("pv", "100");jedis.incr("pv");jedis.incrBy("pv", 5); // 步进值为5print(2, jedis.get("pv"));jedis.decrBy("pv", 2); // 减少2print(2, jedis.get("pv"));// keys *print(3, jedis.keys("*"));// 插⼊⼀个list,lpush key value1 在左侧插⼊数据String listName = "list";jedis.del(listName); // 如果list存在先删除for (int i = 0; i < 10; ++i) {jedis.lpush(listName, "a" + String.valueOf(i));}// lrange key start stopprint(4, jedis.lrange(listName, 0, 12));// 列表所有元素print(4, jedis.lrange(listName, 0, -1));// 列表长度print(5, jedis.llen(listName));// lpop listName 从左边弹lpop元素print(6, jedis.lpop(listName));print(7, jedis.llen(listName));print(8, jedis.lrange(listName, 2, 6));// 获取指定位置的元素 lindex key indexprint(9, jedis.lindex(listName, 3));// linsert key BEFORE|AFTER pivot valueprint(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.AFTER, "a4", "xx"));print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.BEFORE, "a4", "bb"));print(11, jedis.lrange(listName, 0 ,12));// hash:对象属性,不定长属性数String userKey = "userxx";// hset key field valuejedis.hset(userKey, "name", "jim");jedis.hset(userKey, "age", "12");jedis.hset(userKey, "phone", "186********");// hget key field 获取⼀个属性的值print(12, jedis.hget(userKey, "name"));// hgetAll key : 获取属性和值print(13, jedis.hgetAll(userKey));jedis.hdel(userKey, "phone");print(14, jedis.hgetAll(userKey));// 判断是否存在fieldprint(15, jedis.hexists(userKey, "email"));print(16, jedis.hexists(userKey, "age"));// hkeys keyprint(17, jedis.hkeys(userKey));print(18, jedis.hvals(userKey));// hsetnx hahs field value// field不存在,值设置为 value;field存在,命令不执⾏//如果哈希表 hash 不存在,那么⼀个新的哈希表将被创建并执⾏ HSETNX 命令。
Redis总结
Redis总结关于Redis的基础知识,我就不多说了。
我再其他博客⾥⾯介绍了⼀些了。
本博⽂主要汇总,思考总结⼀些Redis的⼀些使⽤场景,解决什么类型的问题。
主要内容有:1.Redis基础:数据类型通⽤命令Jedis2.⾼级持久化redis.conf事务集群3.应⽤五种数据结构可以做个类⽐:1.关于数据类型,及其应⽤场景String类型的数据结构1.基本操作:setgetdelete 成功返回12.在set get之前加个m (multiple多个)msetmget⼀次设置多个,⼀次取多个。
获取数据字符个数:往字符串后⾯追加:原始数据存在就追加不存在就新创建但数据操作与多数据操作的选择问题:set key valuemset key1 value1 key2 value2 .....注意:客户单发送指令消耗时间到达之后执⾏消耗时间结果返回消耗时间但是:指令多,返回的数据也会多,需要综合考量。
发送时间长和执⾏时间,数据发送量等等权衡。
String类型数据的扩展操作:场景1分表,防⽌主键重复问题,MySQL不能实现,通过redis实现。
使⽤:加:incr key减:decr key:⼀次增减⼀个⾃然单位长度(字符串是个纯数字)。
加:给定指定整数增加值:给定指定⼩数增加值:增加: decr 减⼩ decrby⼩结:加法:incry key ⾃然长度减法:decr keydecrby key increment注意:string 作为数值操作:string在redis内部存储默认是⼀个字符串,当遇到增加减少操作incr,decr时会抓成数值型进⾏计算。
redis所有的操作都是原⼦性的,采⽤单线程处理所有的业务,命令式⼀个⼀个执⾏的,因此⽆需考虑并发带来的影响。
如果查出了redis上限范围,将报错。
long.MAX_VALUE总结应⽤场景:主键⽣成策略,保证唯⼀性。
场景2超级⼥声投票,1周之内。
设置数据具有指定声明周期setex tel 10 1 #值是10 时间是1s 注意:毫秒setex tel 10 1 #值是10 时间是1ms 注意:秒String类型数据操作的注意事项:数据操作不成功的反馈与数据正常操作之间的差异 : 成功1 失败0表⽰运⾏结果值: 3 3个数据查询不到时候: nil 等同于 nullstring最⼤存储量: 512M纯数字时候最⼤范围是 Long的最⼤值string应⽤场景,主页⾼频信息控制。
Jedis对redis的五大类型操作代码详解
Jedis对redis的五⼤类型操作代码详解本篇主要阐述Jedis对redis的五⼤类型的操作:字符串、列表、散列、集合、有序集合。
JedisUtil这⾥的测试⽤例采⽤junit4进⾏运⾏,准备代码如下:private static final String ipAddr = "10.10.195.112";private static final int port = 6379;private static Jedis jedis= null;@BeforeClasspublic static void init(){jedis = JedisUtil.getInstance().getJedis(ipAddr, port);}@AfterClasspublic static void close(){JedisUtil.getInstance().closeJedis(jedis,ipAddr, port);}其中JedisUtil是对jedis做的简单封装,代码如下:import org.apache.log4j.Logger;import java.util.HashMap;import java.util.Map;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class JedisUtil{private Logger logger = Logger.getLogger(this.getClass().getName());private JedisUtil(){}private static class RedisUtilHolder{private static final JedisUtil instance = new JedisUtil();}public static JedisUtil getInstance(){return RedisUtilHolder.instance;}private static Map<String,JedisPool> maps = new HashMap<String,JedisPool>();private static JedisPool getPool(String ip, int port){String key = ip+":"+port;JedisPool pool = null;if(!maps.containsKey(key)){JedisPoolConfig config = new JedisPoolConfig();config.setMaxActive(RedisConfig.MAX_ACTIVE);config.setMaxIdle(RedisConfig.MAX_IDLE);config.setMaxWait(RedisConfig.MAX_WAIT);config.setTestOnBorrow(true);config.setTestOnReturn(true);pool = new JedisPool(config,ip,port,RedisConfig.TIMEOUT);maps.put(key, pool);} else{pool = maps.get(key);}return pool;}public Jedis getJedis(String ip, int port){Jedis jedis = null;int count = 0;do{try{jedis = getPool(ip,port).getResource();}catch (Exception e){getPool(ip,port).returnBrokenResource(jedis);}}while(jedis == null && count<RedisConfig.RETRY_NUM);return jedis;}public void closeJedis(Jedis jedis, String ip, int port){if(jedis != null){getPool(ip,port).returnResource(jedis);}}}public class RedisConfig{//可⽤连接实例的最⼤数⽬,默认值为8;//如果赋值为-1,则表⽰不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
Redis学习---Java应用RedisJedis
Redis学习---Java应⽤RedisJedis 阅读⽬录1.封装RedisUtil 构建redis连接池2.使⽤Junit Test Redis String,List,Set Hash等基本数据类型存储3.Redis 事务以及管道应⽤4.Redis 限制登录⼩应⽤<⼀> 封装RedisUtil构建redis连接池1. Redis提供各种语⾔的API,⽬前基于Java语⾔实现的封装Jar有Jedis,在maven版本库最新版本2.9.0版本使⽤maven构建⼯程,配置pom.xml⽂件,即可下载jedis Jar<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>2. 封装RedisUtil. 初始化连接池,使⽤static模块初始化,即类加载时就初始化private static String HOST = "192.168.110.210";private static Integer PORT = 6379;private static String AUTH = "123456";// 可⽤连接实例的最⼤数⽬,默认值为8;// 如果赋值为-1,则表⽰不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_ACTIVE = 1024;// 控制⼀个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8.private static int MAX_IDLE = 200;// 等待可⽤连接的最⼤时间,单位毫秒,默认值为-1,表⽰永不超时。
Jedis超时时间设置梳理
Jedis超时时间设置梳理JedisConnectionException: Unexpected end of stream #932 Repeatable exception and for the life of me, I cannot find something I'm doing wrong.redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:198)at redis.clients.util.RedisInputStream.read(RedisInputStream.java:180)at redis.clients.jedis.Protocol.processBulkReply(Protocol.java:158)at redis.clients.jedis.Protocol.process(Protocol.java:132)at redis.clients.jedis.Protocol.processMultiBulkReply(Protocol.java:183)at redis.clients.jedis.Protocol.process(Protocol.java:134)at redis.clients.jedis.Protocol.read(Protocol.java:192)at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:282)at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:227)at redis.clients.jedis.JedisPubSub.process(JedisPubSub.java:108)at redis.clients.jedis.JedisPubSub.proceedWithPatterns(JedisPubSub.java:95)at redis.clients.jedis.Jedis.psubscribe(Jedis.java:2513)at BenchRedisConsumer$BenchRunner.run(BenchRedisConsumer.java:208)at ng.Thread.run(Thread.java:745)Running redis version 2.8.19 on Linux 3.16.0-33-generic #44-Ubuntu SMP Thu Mar 12 12:19:35 UTC 2015 x86_64 x86_64 x86_64 GNU/LinuxJava version:java version "1.7.0_76"Java(TM) SE Runtime Environment (build 1.7.0_76-b13)Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)client-output-buffer-limit was the cause. redis-server closed the connections, leading to the exceptions.redis.clients.jedis.JedisPoolConfigpackage redis.clients.jedis;import mons.pool2.impl.GenericObjectPoolConfig;public class JedisPoolConfig extends GenericObjectPoolConfig {public JedisPoolConfig() {// defaults to make your life with connection pool easier :)setTestWhileIdle(true);setMinEvictableIdleTimeMillis(60000);setTimeBetweenEvictionRunsMillis(30000);setNumTestsPerEvictionRun(-1);}}mons.pool2.impl.GenericKeyedObjectPool从Pool(也就是 LinkedBlockingDeque<PooledObject<T>>)中获取⼀个PooledObject<T> 需要等待的时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
启动Redis服务器启动客户端Redis命令目录key(建)保存键值对set key value查询指定键对象get key删除给定键的对象del key1key2…设置键过期时间EXPIRE key exptime剩余时间ttl key查看搜索有键值keys键migrate指令(移动将数据移动另外一个数据)将key原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上的key会被删除。
MOVE key db将数据库的key移动到指定的数据库db当中。
如果当前数据库(源数据库)和给定数据库(目标数据库)有相同的名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。
因此,也可以利用这一特性,将MOVE当作锁(locking)原语(primitive)。
Obejct{refcount|encoding|idletime}通常用在debug或者了解为了节省空间使用特殊的编码情况,当redis用作缓存时候,也可以通过OBJECT命令中的信息,决定key的驱逐策略.object refcount key:返回给定key引用所存储的值的次数.object encoding key:返回给定key所存储的值编码可以有raw(一般字符串)或int(用字符串表示64位数字是为了节约空间)。
ziplist或linkedlist。
ziplist是为节约大小较小的列表空间而作的特殊表示。
intset或者hashtable。
intset是只储存数字的小集合的特殊表示。
zipmap或者hashtable。
zipmap是小哈希表的特殊表示。
ziplist或者skiplist格式。
ziplist用于表示小的有序集合,而skiplist则用于表示任何大小的有序集合。
object idletime key:返回给定key自存储的空闲时间persist key将key从带生存时间转换为持久的不带生存时间.pexpire设置key的过期时间单位为毫秒pexpireat设置过期时间戳randomkey随机产生一个keyrename oldkey newkey修改key的名字,如果存在则覆盖,不存在则不修改renamenx修改key的名字,如果名字存在就不修改restore key ttl反序列化值JavaAPI调用Redis下载commons-pool2-2.2.jar该包是jedis依赖的第三方包.并且从网上下载到jedis客户端源码具体下载地址为https:///xetorthio/jedis该种连接方式同时也是redis官方比较推荐的一种连接方式,下载到jedis源码,并且编译打包成jar文件目前版本最高支持到redis到2.8.5.jedis源码下载页面redis提供了大量的指令集.具体指令可以参考http://redis.io/commands网址。
jedis作为连接redis的客户端软件,底层实际上是通过ServerSocket连接redis服务器继而实现用户和redis 内存数据库的交互。
由于redis目前官网提供的最新版本是2.8.x版本.但是注意的是目前已不再对XP系统32位提供支持,如需要需要自己编译使用.使用Jedis连接redis数据库,实施起来没有事先想象的那么难入手,事实上使用jedis提供的API访问redis数据库还是比较轻松.创建Jedis对象,该对象用来连接Redis内存数据库.Jedis jedis=new Jedis(ip,port),ip指的是redis内存数据库所在内存数据库所在的主机ip地址,port指的是redis呢哦存数据库服务的端口号,默认是6379.Redis是一个key-value存储系统。
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。
以下是针对jedis对redis内存数据库访问的数据类型做为学习和使用的路线介绍.Redis数据库,默认的可以讲数据库的库表分成0~15个子库,每个库之间独立.使用move指令实现多个子库之间数据的迁移。
默认使用0号子库。
如果用户有特殊需求可以使用select指令在执行其他指定之前选着相应的子库。
例如jedis.select(0)就表示用户的操作是在0号子库下完成.一、String操作(1)保存字符串key-value类型数据.默认保存的数据会永久的保存在磁盘上,数据不会丢失.(2)保存数据key-value指定过期时间数据,过期时间是以秒为单位.(3)保存数据如果存在新的数据就不会覆盖.(4)在字符串自定位置覆盖(5)字符串追加Append(6)一次添加多个key-value,键值必须成对出现(7)一次添加多个key-value,键值必须成对出现,要求如果存在就取消此次插入操作.(8)获取单个key的值(9)批量获取key-value(9)删除键值对(10)判断键是否存在(11)清空指定DB子库该操作需要谨慎使用(12)清除所有子库二、List操作(1)往list插入值(2)修改List指定位置的值(3)获取List集合里面的值(4)删除集合元素(5)删除集合(6)获取指定下标数据(7)在指定数据项之前/后插入数据(8)添加数据到List中,如果集合不存在就不再添加返回值是表示添加的下标如果集合不存在就返回0(9)获取数组的长度(10)元素出栈操作(11)删除指定下标范围内的数据三、HashSet和Sortedset(1)添加一条数据,帮助去除重复(2)获取集合数据(3)获取元素个数(4)判断某个元素是不是set的成员(5)删除指定项数据(6)获取set中所有数据(7)从set栈中弹出信息(8)计算两个set集合之间的交集(9)计算两个set集合之间的并集(10)计算两个set集合之间的差集(11)SotedSet添加元素(12)获取sortedset中的元素(13)获取元素score(14)获取元素个数(15)删除指定元素(16)获取指定score范围内的元素(17)获取指定score内元素的个数四、HashMap(1)添加Map到数据库(2)获取Map中的参数(3)获取整个map中的值(4)判断某个key是否存在(5)遍历map的所有键(6)遍历map中的所有值(7)获取所有键的歌词(8)添加一条记录到map,如果存在就不添加(9)删除map中的指定项(10)删除map中指定的key(11)删除整个map五、Pipellineredis是一个CS模式的并且是基于TCP的客户端服务器,客户端通过发送socket连接发起多个请求,每个请求发送出去后程序一般处于阻塞状态,等待redis服务器的处理,redis处理完后将处理后的报文发送给客户端.这种阻塞式没有充分利用到redis的处理能力,处理可以使用mest/mget单条指令来处理多个key的命令,一般还可以使用pipleline方式,该方式是通过打包客户端指令形式,将数据打包发送给服务器就无需等待单条指令的返回,redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。
需要注意的是redis 在处理所有打包数据之前,必须缓存所有指令的处理结果,打包发送虽然可以解决原先在网络延迟上的时间,但是由此会带来内存的消耗,因此并不是打包指令越多越好。
下面做一个性能测试,第一个使用普通的方式实现往redis数据库中插入10万条数据情况下测试时间如下:使用pipleline打包指令发送.总结:pipleline一般用来批量操作是为了提高操作效率节省网络延迟带来的时间损耗,可以考虑使用pipleline方式实现数据操作指令的打包发送。
六、排序Redis从1.0.0版本开始支持对于保存在list、set、sorted set的数据排序,默认情况下,支持对数值类型的数据或者字符串排序。
(1)简单排序(2)使用SortingParams排序(3)以上两种使用的排序都是针对数值类型的数据排序,如果需要对非数值类型的排序需要使用alpha参数实现排序.(4)排序后分页查询(5)按照外部key排序有时候你希望使用外部的集合的值作为权重来排序而并不是查询出集合本身来排序,此时需要使用by语句作为查询.(6)对hashMap中的数据来进行排序操作.七、池化多线程下使用同一个Jedis实例是不切合实际的,线程不安全,可是如果创建太多Jedis实例,也会给服务器造成一定的压力和负载,为了挺高redis在多线程的表现,可以使用JedisPool,JedisPool是线程安全的网络连接池。
一般可以通过JedisPool创建一个可靠的Jedis实例。
用户可以从池中获取Jedis连接。
八、分布式处理需要注意对于Redis2.X版本不支持集群功能,Redis在3.0后将实现集群机制,目前Redis实现集权的方法主要是采用一致性hash分片(Shard),将不同的key分别分配到不同的Redis服务器上,达到横向扩展的目的。
一般可以通过JedisShardInfo获知某一个键存储的目标主机信息.使用该种方式的集群会出现以下两个问题,分别是扩容问题、单点故障问题。
九、Redis的Master/SlaveRedis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb 文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中。
Redis的复制功能是完全建立在Redis的内存快照的是持久化策略上,无论持久化策略是什么,只要用到Redis的复制功能,就一定会有内存快照的发生,Slave端向master发送同步指令,简单判断是否又正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。
Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构。
Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理。
切换为从机模式:切换成主机模式注意:Slave从库在连接Master主库时,Master会进行内存快照,然后把整个快照文件发给Slave,也就是没有象MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来非常多的问题。
比如一台线上正在运行的Master主库配置了一台从库进行简单读写分离,这时Slave由于网络或者其它原因与Master断开了连接,那么当Slave 进行重新连接时,需要重新获取整个Master的内存快照,Slave所有数据跟着全部清除,然后重新建立整个内存表,一方面Slave恢复的时间会非常慢,另一方面也会给主库带来压力。