基础
概念
redis是一款高性能的NOSQL系列的非关系型数据库
- NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。redis。hbase等
- NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NOSQL和关系型数据库比较
优点
- 成本
- 查询速度
- 存储数据的格式
- 扩展性
缺点
- 维护的工具和资料有限
- 不提供对sql的支持
- 不提供关系型数据库对事务的处理。
- 一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
主流的NOSQL产品
键值(Key-Value)存储数据库
内容缓存,主要用于处理大量数据的高访问负载
Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
一系列键值对
列存储数据库
Cassandra, HBase, Riak
分布式的文件系统
以列簇式存储,将同一列数据存在一起
文档型数据库
CouchDB、MongoDB
Web应用(与Key-Value类似,Value是结构化的)
一系列键值对
图形(Graph)数据库
- Neo4J、InfoGrid、Infinite Graph
- 社交网络
- 图结构
Redis
Redis支持的键值数据类型
- 字符串类型 string
- 哈希类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合类型 sortedset
redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等等)
- 聊天室的在线好友列表
- 任务队列。(秒杀、抢购、12306等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒
- 分布式集群架构中的session分离
下载安装
解压后make编译直接可以使用,查看官网
- redis.conf:配置文件
- redis-cli.exe:redis的客户端
- redis-server.exe:redis服务器端
命令操作
redis的数据结构
- redis存储的是key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
value的数据结构
- 字符串类型 string
- 哈希类型 hash : map格式
- 列表类型 list : linkedlist格式。支持重复元素
- 集合类型 set : 不允许重复元素
- 有序集合类型 sortedset:不允许重复元素,且元素有顺序
字符串类型 string
- 存储: set key value/set username zhangsan
- 获取: get key/get username
- 删除: del key/del age
哈希类型 hash
- 存储: hset key field value
- 获取
- hget key field: 获取指定的field对应的值
- hgetall key:获取所有的field和value
- 删除: hdel key field
列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
- 添加
- lpush key value: 将元素加入列表左边(头部)
- rpush key value:将元素加入列表右边
- 获取
- lrange key start end :范围获取
- lrange myList 0 -1
- 删除
- lpop key: 删除列表最左边的元素,并将元素返回
- rpop key: 删除列表最右边的元素,并将元素返回
集合类型 set : 不允许重复元素
存储:sadd key value – value可以写多个,用空格
获取:smembers key:获取set集合中所有元素
删除:srem key value:删除set集合中的某个元素
有序集合类型
sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
存储:zadd key score value/zadd mysort 60 zhangsan
获取:
- zrange key start end [withscores]
- zrange mysort 0 -1
- zrange mysort 0 -1 withscores
删除:zrem key value
通用命令
- keys * : 查询所有的键
- type key : 获取键对应的value的类型
- del key:删除指定的key value
持久化
redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
redis持久化机制
RDB:默认方式,不需要进行配置,默认就使用这种机制
- 在一定的间隔时间中,检测key的变化情况,然后持久化数据
- 编辑redis.conf文件
# after 900 sec (15 min) if at least 1 key changed
save 900 1
- 重新启动redis服务器,并指定配置文件名称 redis-server.exe redis.windows.conf
- 数据保存在:.pdb文件
AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
- 编辑redis.windwos.conf文件
- appendonly no(关闭aof)
- appendfsync always : 每一次操作都进行持久化
- appendfsync everysec : 每隔一秒进行一次持久化(默认)
- appendfsync no : 不进行持久化
- 存入:appendonly.dof
Java客户端 Jedis
Jedis: 一款java操作redis数据库的工具.
使用步骤
- 下载jedis的jar包
- 使用
- 获取连接,创建对象
- 操作
- 关闭连接
Jedis操作各种redis中的数据结构
字符串类型 string
set/get
可以使用setex()方法存储可以指定过期时间的 key value
- 将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
- jedis.setex(“activecode”,20,”hehe”);
- 将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
哈希类型 hash : map格式
- hset/hget/hgetAll
列表类型 list : linkedlist格式。支持重复元素
- lpush / rpush
- jedis.lpush(“mylist”,”a”,”b”,”c”);//从左边存
- lpop / rpop
- lrange start end : 范围获取
- jedis.lrange(“mylist”, 0, -1);
集合类型 set : 不允许重复元素
- sadd
- smembers:获取所有元素
- 有序集合类型 sortedset:不允许重复元素,且元素有顺序
- zadd
- jedis.zadd(“mysortedset”,3,”亚瑟”);
- zrange
jedis连接池: JedisPool
创建JedisPool连接池对象
- 调用方法 getResource()方法获取Jedis连接
创建一个配置对象(耦合度低)
- JedisPoolConfig()
创建Jedis连接池对象
- JedisPool(config,”localhost”,6379)
获取连接
- jedisPool.getResource()
使用
- 关闭 归还到连接池中 close
连接池工具类
- 使用redis缓存一些不经常发生变化的数据。
- 数据库的数据一旦发生改变,则需要更新缓存
- 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
- 在service对应的增删改方法中,将redis数据删除。
redis安装和配置
安装
下载安装包
上次课前资料提供的安装包,或者:官网下载
建议上传到我们的home下:/home/leyou/解压
tar -xvf redis-4.0.9.tar.gz
编译安装
mv redis-4.0.9 redis
cd redis
make && make install
配置
修改安装目录下的redis.conf文件
vim redis.conf
修改以下配置:
bind 127.0.0.1 # 将这行代码注释,监听所有的ip地址,外网可以访问
protected-mode no # 把yes改成no,允许外网访问
daemonize yes # 把no改成yes,后台运行
启动或停止
redis提供了服务端命令和客户端命令:
- redis-server 服务端命令,可以包含以下参数:
start 启动
stop 停止 - redis-cli 客户端控制台,包含参数:
-h xxx 指定服务端地址,缺省值是127.0.0.1
-p xxx 指定服务端端口,缺省值是6379
设置开机启动
1) 输入命令,新建文件
vim /etc/init.d/redis
输入下面内容:
# chkconfig: 2345 90 10
# description: Redis is a persistent key-value database
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF="/home/leyou/redis/redis.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
然后保存退出
注意:以下信息需要根据安装目录进行调整:
EXEC=/usr/local/bin/redis-server # 执行脚本的地址
REDIS_CLI=/usr/local/bin/redis-cli # 客户端执行脚本的地址
PIDFILE=/var/run/redis.pid # 进程id文件地址
CONF=”/usr/local/src/redis-3.0.2/redis.conf” #配置文件地址
2)设置权限
chmod 755 /etc/init.d/redis
3)启动测试
/etc/init.d/redis start
启动成功会提示如下信息:
Starting Redis server...
Redis is running...
4)设置开机自启动
chkconfig --add /etc/init.d/redis
chkconfig redis on