Redis:REmote DIctionary Server 远程字典服务器
是一个开源免费,ANSI C编写,遵守BSD协议,支持网络, Key-Value分布式内存DB,基于内存运行,支持持久化NoSql DB,数据结构服务器,提供多种语言的API
一:在Window下安装
s1:下载 Redis-x64-xxx.zip压缩包,解压到D盘后,将文件夹重新命名为 redis;
s2:cmd,切换到安装目录D盘下:cd /workTools/redis, 运行:redis-server.exe redis.windows.conf 开启服务端
(别关闭该窗口)
s3:另开一个cmd, 切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 连接
测试能否使用:方法一:设置键值对 set myKey abc
取出键值对 get myKey
方法二: Ping命令 查看服务是否运行 > ping //连接正常返回 PONG (#还可用不断的ping来测量延迟值)
二:特点:
支持数据持久化,可以将内存中数据写入磁盘
支持数据的备份,即master-slave模式的备份
工作模式:
redis:单进程、阻塞
mem多进程,非阻塞。 Redis在同一时刻只能处理一个请求,后来的请求需要排队等待 优点:无需处理并发问题,降低系统复杂度 缺点:不适合缓存大尺寸对象(超过100kb)(说明:Memcache是内存对象缓存系统,设计目标为通过缓解数据库的压力来加快web应用的响应速度
redis应用场景更丰富,Memcache仅适合作为缓存使用
)
三:Redis支持的键值数据类型
字符串(String)、字符串列表(list)、哈希(hash)、字符串集合(set)、有序字符串集合(zset,sorted set)
1.Key定义注意点:
不要过长(过长消耗内存、降低查找效率)不要过短 (可读性)统一的命名规范
Keys的通用操作
显示所有的key: keys *查询以字符串str开头的key : keys str? 删除多个key: del key1 key2 key3 ... 判断key是否存在,存在返回1不存在返回0 : exists key对key进行重命名 : rename key newkey 设置过期的时间: expire key times(秒) 剩余时间: ttl key查看类型 : type key2.String
在redis中以二进制方式操作字符串value最多可以容纳数据长度为512M赋值 set key value 取值 get key 修改 getset key1 value2删除 del key 增加 incr key (将指定key对应的value值增加1,若无该key,则初始化一个默认为0增加1,若value不为整型,则报错)减少 decr key (将指定key对应的value值减1,若无该key,则初始化一个默认为0减1)增加n incrby key n减少n decrby key n添加字符串,返回长度 append key str (key不存在则初始化有个,长度为str的长度)3.Hash:
String Key和String Value的map容器;一个Hash可以存储 2^32 -1(=4294967295)个键值对特别适合用于存储对象
设置值:hset hashname key1 val1设置多个值:hmset hashname key1 val1 key2 val2 = hset hashname key1 val1 key2 val2获取单个key值:hget hashname key1获取多个key值:hmget hashname key1 key2获取全部 hgetall hashname 删除单个/多个key值:hdel hashname key1 key2增加n hincrby hashname key1 n 判断是否存在 hexists hashname key包含key的多少 hlen hashname获取所有key hkeys hashname获取所有key hvals hashname4.list
最多可存储 2^32 - 1 元素
存储list常用命令:两端添加 左侧插入:lpush key value1 value2 value3 ...右侧插入:rpush key value1 value2 value3查看列表 lrange key start end (可从0或负数开始结束)两端弹出 左边弹出 lpop key右边弹出 rpop key获取列表元素个数 llen keykey存在才插入左侧 lpushx key valuekey存在才插入右侧 rpushx key value删除 lrem key (+_)startN spevalue (lrem list 2 3 从头到尾,删除2个3lrem list -2 1 从尾到头,删除2个1lrem list 0 2 删除所有2)设置某个下标对应value lset key n value在第一个b之前插入11 linsert list before b 11 在第一个b之后插入22 linsert list after b 22 取出mylist1的右边的一个元素放入mylist2的左边第一个元素前 rpoplpush mylist1 mylist2rpoplpush list1 list2 将 list1右边的值抛出,压入到list2左边应用场景:消息队列中,lpush生产者,rpop消费者,当消费者rpoo一条数据的时候,发发生了错误,那么会导致取出的消息丢失,那么使用rpoplpush-先取出主队列,并插入备份队列,再去处理数据 就可以避免消息丢失5.set
String类型的无序集合
不允许出现重复的元素运用场景:跟踪一些唯一性数据、用于维护数据对象之间的关联关系。其具有的交集,并集,差集运算是非常高效的,基于这个特点我们可以维护数据对象之间的关联关系,比如说从SQL型的数据库中取出数据,然后直接使用redis进行缓存,进行一些快速的运算。添加: sadd key value1 value2 value3 ... (成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。)删除: srem key value1 value2 ....查看所有:smembers key某value是否存在: sismember key value差集(注意key的顺序):sdiff key1 key2交集:sinter key1 key2并集(会去重):sunion key1 key2数量: scard key随机一个元素 :srandmember key将两个集合的差集存入新集合:sdiffstore newKey key1 key2将两个集合的交集存入新集合: sinterstore newKey key1 key2将两个集合的并集存入新集合: sunionstore newKey key1 key26.Sorted-Set (Zset)
与Set的区别:sorted-set:每个成员都有一个double类型的分数与之关联,成员唯一,分数可重复Sorted-Set中的成员在集合中的位置是有序的适合存储带分数成绩之类的数据。应用场景:如大型游戏在线积分排行榜;构建索引数据添加 zadd sortName scord1 value1 scord2 value2查分数 (scord1): zscore sortname value 具体成员数:zcard sortname删除:zrem sortname value1 value2..按范围删除 zremrangebyrank sortName 0 4zremrangebyscore sortName 80 100显示所有元素(按分数升序):zrange sortname 0 -1显示所有元素及对应分数(按分数升序) zrange sortname 0 -1 withscores显示所有元素及对应分数(按分数降低序) zrevrange sortname 0 -1 withscores显示分数在0到100之间的2个元素及对应分数 zrangebyscore sortname 0 100 withscores limit 0 2给某元素(value)加分数(socre) zincrby sortname score value某个分数区间的元素个数 zcount sortname 80 90
四:多数据库
select n:选择数据库,默认连接0号数据库, 一个redis最多有16个实例,从0开始 move key n:把key移动到n号数据库支持事务 multi: 开启事务 exec: 执行 discard: 回滚redis在事务中所有命令都将被串行化顺序执行,事务执行期间 redis不会再为其他的客户端 提供任何的服务 从而保证事务中所有的命令被原子化执行 ,那么和关系型数据库中事务相比 ,redis 中如果某个命令执行失败 ,它后面的命令还会被执行。
五:redis持久化(数据从内存同步到硬盘)
RDB方式 默认支持,不需要配置,指定时间间隔将内存数据集快照写入磁盘
优势:
1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难 2.压缩文件转移到其他介质上 3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作,避免服务器进程执行I/O操作,启动效率高 劣势: 1.无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失 2.通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒
AOF方式 以日志的形式记录服务器处理的每一个操作,在redis服务器启动之初会读取该文件,重新构建数据库,保证启动后数据库中的数据是完整的
优势: 1.同步: a.每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失 b.每修改同步:每分钟发生的变化记录到磁盘中,效率低,安全 c.不同步 2.日志写入操作采用追加模式append a.系统宕机,不影响已存在的内容 b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性 3.如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全 4.格式清晰的日志文件,完成数据的重建六:Jedis
是redis官方首选的Java客户端开发包commons-pool2-2.3.jarjedis-2.7.0.jar
public class RedisJava {
public static void main(String[] args) {
//连接本地的Redis服务 Jedis jedis = new Jedis("127.0.0.1"); System.out.println("连接成功"); //查看服务是否运行 System.out.println("服务正在运行:"+jedis.ping()); //设置redis字符串数据 jedis.set("key_run", "run_ok"); //获取存储的数据并输出 System.out.println("redis存储的字符串为:"+jedis.get("key_run")); //存储数据到列表中 jedis.lpush("list_key", "list_value1"); jedis.lpush("list_key", "list_value2"); jedis.lpush("list_key", "list_value3"); //获取存储的数据并输出 List<String> list = jedis.lrange("list_key", 0, 2); for(int i=0; i<list.size(); i++) { System.out.println("列表项为:" + list.get(i)); } //获取数据并输出 Set<String> keys = jedis.keys("*"); Iterator<String> it = keys.iterator(); while(it.hasNext()) { String key = it.next(); System.out.println(key); } }}