1.【redis是什么】
Redis 全程:REmote DIctionary Server(远程字典服务器)
Redis 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行
并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
目前,Vmware在资助着redis项目的开发和维护。

Redis从它的许多竞争继承来的三个主要特点:
1).Redis数据库完全在内存中,使用磁盘仅用于持久性。
2).相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
3).Redis可以将数据复制到任意数量的从服务器。

Redis 优势
1).异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
2).支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容3).易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
4).操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
5).多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

Redis 网站
1). http://redis.io/ (官网)
2). http://redis.cn/

2.【Redis启动后杂项基础知识讲解】

1).Redis是一个单进程服务器:单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率。epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

2).默认16个数据库,类似数组下表从零开始,初始默认使用零号库

3).select 命令切换数据库

4).dbsize 查看当前数据库的key的数量

5).flushdb 清空当前库

6).Flushall 清空全部库

redis属性incr使用java redis中的incr_Redis


7).统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上

8).Redis索引都是从零开始
9).默认端口是6379

3.【Redis 数据类型】
redis是一种高级的key:value存储系统,其中value支持五种数据类型:
1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)

而关于key,有几个点要提醒大家:
1).key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2).key也不要太短,太短的话,key的可读性会降低;
3).在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。

Redis key 常用方法

1).keys *

查看数据库中所有的可以list,通常不建议使用,如果key有成千上万会很痛苦。

2).exists key的名字

判断某个key是否存在

3).move key db

移动key到其他数据中,当前库就没有了,被移除了

4). expire key 秒钟

为给定的key设置过期时间,过期后key从数据库中被删除

5).ttl key

查看还有多少秒过期,-1表示永不过期,-2表示已过期

6). type key

查看key是什么类型

redis属性incr使用java redis中的incr_redis属性incr使用java_02

1. string(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。意思是redisd string可以包含任何数据,比如:jpg图片或者序列化的对象。

一个redis中的字符串value最多可以存储512M。

常用方法

1)set/get/del/append/strlen

redis属性incr使用java redis中的incr_redis属性incr使用java_03


2)Incr/decr/incrby/decrby,一定要是数字才能进行加减

由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。

redis属性incr使用java redis中的incr_redis属性incr使用java_04


另外,如果是数字字符串类型进行数值操作时,redis会将字符串类型转换成数值。

redis属性incr使用java redis中的incr_redis_05

3)getrange/setrange

getrange:获取指定区间范围内的值,类似between……and的关系,从零到负一表示全部

setrange:设置指定区间范围内的值,格式是setrange key值 具体值

redis属性incr使用java redis中的incr_redis属性incr使用java_06

4) setex(set with expire)键秒值/setnx(set if not exist)

setex:设置带过期时间的key,动态设置。

setex 键 秒值 真实值

setnx:只有在 key 不存在时设置 key 的值。

redis属性incr使用java redis中的incr_redis属性incr使用java_07

6)mset/mget/msetnx

mset:同时设置一个或多个 key-value 对

mget:获取所有(一个或多个)给定 key 的值。

msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

redis属性incr使用java redis中的incr_redis_08

2.Hash(哈希)
Redis hash 是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象,类似Java里面的Map。hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希
我们来看一个例子:
3.list(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
它的底层实际是个链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的
虽然lists有这样的优势,但同样有其弊端,那就是,链表型lists的元素定位会比较慢,而数组型lists的元素定位就会快得多。
lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。我们来看几个例子:

lists的应用相当广泛,随便举几个例子
1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
2.利用LRANGE还可以很方便的实现分页的功能。
3.在博客系统中,每片博文的评论也可以存入一个单独的list中。

4.Set(集合)
Redis的Set是string类型的无序集合。它是通过HashTable实现实现的。
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。我们来看例子:

对于集合的使用,也有一些常见的方式,比如,QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。
5.zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。