为什么需要缓存
我们发现,当很多网页的首页加载时,需要查询的数据非常多:大广告、小广告、楼层、商品类目信息等等。
首页的访问量非常大,如果每次都访问后台接口,查询所有的数据,会大大增加数据加载所需的时间。
然而这些信息一般更新的频率比较低,短时间内不会发生改变。
因此,我们可以考虑在前台系统中,增加一层缓存,把这些数据缓存起来,请求到来时,不再查询后台接口,而是直接读取缓存中的数据。
这样就能大大减少首页加载所需时间,提高并发性能.
技术选型Redis和Memcached
两者有什么区别?
从性能来看:
redis:单线程,因此在大数据量的情况下,略逊色于Memcache
Memcache:多线程,性能强劲,但是在数据量不大时,优势不明显从存储方式来看:
redis:支持数据持久化和主从备份。数据更安全,可以搭建集群
Memcache:数据存于内存,没有持久化功能从数据结构来看:
redis:除了基本的k-v 结构外,支持多种复杂结构
Memcache:只支持基本k-v 结构
结论:
如果对持久化、数据结构和处理有复杂要求的,肯定使用Redis;如果仅仅是基本的key-value结构的基本get和set需求,建议使用memcache
redis特性
CentOS下设置自动启动
vim /etc/init.d/redis
#!/bin/sh
# 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="/usr/local/src/redis-3.0.2/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
redis通用操作指令
1.keys命令:获取符合规则的键名列表
语法:keys pattern
示例:keys * (查询所有的键)
2.EXISTS指令:判断一个键是否存在,如果存在返回整数1,否则返回0
语法:EXISTS key
3.DEL:删除键,可以删除一个或多个键,返回值是删除的键的个数
语法:DEL key [key … ]
4.TYPE :Redis中支持的数据类型:string(字符串的key-value)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合)
使用type可以获取键值的数据类型。
语法:TYPE key [key …]
实例:
redis 127.0.0.1:6379> keys *
1) "username2"
redis 127.0.0.1:6379> type username2
string
5.HELP
help +tab 键
Redis字符串
1.概述
字符串结构,其实是Redis中最基础的K-V结构。其键和值都是字符串。类似Java的Map<String,String>
2.常用命令:
序号 命令及描述
1 SET key value :设置指定 key 的值
2 GET key :获取指定 key 的值。
3 GETRANGE key start end :返回 key 中字符串值的子字符
4 INCR key:将 key 中储存的数字值增一。
5 INCRBY key increment:将 key 所储存的值加上给定的增量值(increment) 。
6 DECR key:将 key 中储存的数字值减一。
7 DECRBY key decrement:key 所储存的值减去给定的减量值(decrement) 。
8 APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
9 STRLEN key:返回 key 所储存的字符串值的长度。
10 MGET key1 [key2..]:获取所有(一个或多个)给定 key 的值。
11 MSET key value [key value ...]:同时设置一个或多个 key-value 对。
3.基本语法:
- set&get
SET key value 设置指定 key 的值
GET key 获取指定 key 的值。
127.0.0.1:6379> set name "lucy"
OK
127.0.0.1:6379> get name
"lucy"
127.0.0.1:6379>
- INCR和INCRBY(数字自增)
INCR 命令将 key 中储存的数字值增一。
语法:INCR keyName
返回值:执行INCR命令后key 的值
示例1: 当key没有值时:(先初始化为0,再+1)
127.0.0.1:6379> get id
(nil)
127.0.0.1:6379> incr id
(integer) 1
127.0.0.1:6379> get id
"1"
示例2 : 当key有值,并且也是数值:(直接值+1)
127.0.0.1:6379> set numb 100
OK
127.0.0.1:6379> get numb
"100"
127.0.0.1:6379> incr numb
(integer) 101
127.0.0.1:6379> get numb
"101"
示例3: 当key有值,但是不是数值形式:(会报错)
127.0.0.1:6379> get name
"lucy"
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
注意:
1) 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
2) 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
3) 数字值在Redis中以字符串保存
- INCRBY
INCRBY与INCR命令基本类似, INCRBY命令将 key 中储存的数字加上指定的增量值。
语法: INCRBY key_name incr_amount
127.0.0.1:6379> get id
"1"
127.0.0.1:6379> incrby id 10
(integer) 11
127.0.0.1:6379> get id
"11"
- DECR和DECRBY(数值自减)
Decr 命令将 key 中储存的数字值减一。
语法:DECR key_name
注意:
1) 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
2) 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
3) 数字值在Redis中以字符串保存
- APPEND(追加数据)
Append 命令用于为指定的 key 追加值。
1) 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
2) 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
语法: APPEND key value
示例1:对一个不存在的数据进行操作
127.0.0.1:6379> get msg
(nil)
127.0.0.1:6379> append msg hello
(integer) 5
示例2:操作一个已经有值的key
127.0.0.1:6379> get name
"lucy"
127.0.0.1:6379> append name jack
(integer) 8
STRLEN(字符串长度)
Strlen 命令用于获取指定 key 所储存的字符串值的长度。
语法:STRLEN key
返回值:key的值字符串长度,如果key不存在,返回0MSET&MGET(批量添加和获取)
Mset 命令用于同时设置一个或多个 key-value 对。
语法:MSET key1 value1 key2 value2 … keyN valueN
Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil
语法:MGET KEY1 KEY2 .. KEYN