
1、首先你要制定好你的id规则,比如年月日+序列
2、按照上面的规则,你只需要保证序列自增即可
3、利用redis的string类型,incr my_sequeue,mysequeue会从1开始自增
4、最终生成如:201711131、201711132、201711133这样的序列
5、如果你要按年内或者月内自增,就需要设置my_sequeue的过期时间,保证下一月或者下一年从1开始
一 单机安装
解压redis
进入文件夹执行mke and make install
1
2
# prefix指定安装路径
make && make prefix=/opt/hjf/redis-2818 install
配置环境变量
以后自动打开redis服务
进入解压包的utils目录, 执行:
1
/install_serversh
进入redis服务器:
1
redis-cli
二shell命令
1 strings
1 set:设置
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX: 过期时间(秒)
PX: 过期时间(毫秒)
NX: 键不存在时, 才能设置(只能创建, 不能修改)
XX: 键存在时, 才能设置(只允许修改, 不允许创建)
普通模式
1
2
# 默认永久保存
set k1 aa
设置生命周期
1
2
# 5s后自动删除
set k3 c ex 5
过时后就获取不了了
只允许创建, 不允许修改
1
2
# 相当于: setnx k4 abc
set k4 abc nx
只允许修改, 不允许创建
1
set k5 123 xx
2 get:获取
GET key
1
get k1
3 keys: 获取key列表
KEYS pattern
1
2
keys
keys k
4 setnx: 如果key不存在,则执行
SETNX key value
相当于只允许创建,而不允许修改。
1
2
setnx k3 5
set k3 5 nx #等价
5 strlen 获取长度:
STRLEN key
1
strlen k6
6 清空库
flushall 清空所有库的数据:
1
flushall
flushdb: 清空当前库数据:
1
flushdb
7 expire 设置过期时间:
EXPIRE key seconds
1
expire k1 5
8 type: 查看key的类型
1
TYPE key
虽然所有的数据类型都是以“string”存储,但是有属性加一区别:
9 自增/自减
incr / incrby: 增加
INCR key: 自增+1
INCRBY key num: 自增 + num
decr / decrby:减少
DECR key: 自减 - 1
INCRBY key num: 自减 - num
注意: 在遇到数值 *** 作时,redis会将字符串类型转换成数值
由于INCR等指令本身就具有原子 *** 作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的 *** 作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。
10 getset 返回旧值,并设置新的值:
GETSET key value
11 append: 追加
APPEND key value
12 getrange获取子字符串
GETRANGE key start end
2 集合:
1 无序集合
sadd: 创建集合
1
sadd set1 s1 s2 s3 s2 s4 s1
smembers: 读取集合元素
1
smembers set1
sismember : 判断元素是否在集合中
如果在, 则返回1; 如果不在, 则返回0
1
sismember set1 "one"
srandmember : 随机获取集合元素
1
srandmember set1
mset:同时设置多组key-value
MSET key value [key value …]
1
mset key1 value1 key2 value2
sdiff: 差集
1
sdiff num1 num2
交集:sinter
1
sinter num1 num2
并集:sunion
1
sunion num1 num2
2 有序集合
zadd: 添加元素
ZADD key score member [score member …]
1
2
zadd set2 1 one
zadd set2 2 two 3 three 4 four 5 five
zrange: 获取元素
获取所有元素
1
zrange set2 0 -1
获取指定范围内的元素
1
zrange set2 2 4
列出所有元素,同时列出其位置
1
zrange set2 0 -1 withscores
3 哈希
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
hmset: 建立哈希,并赋值
1
hmset user1 user zhangsan age 20 gender m
hgetall: 列出哈希的内容
1
hgetall user1
hget: 获取哈希中的某一个值
1
hget user1 age
hset: 更改哈希中的某一个值
1
hset user1 user lisi
hkeys: 获取key列表
1
hkeys user1
hvals: 获取value列表
1
hvals user1
4 列表
lpush: 向列表头部(左侧)插入元素, 返回当前列表元素个数
1
2
lpush l1 a
lpush l1 b c
rpush: 向列表尾部(右侧)插入元素, 返回当前列表元素个数
1
2
rpush l1 c
rpush l1 d
lrange: 获取列表元素
1
2
3
4
# 获取编号0到倒数第一个元素
lrange l1 0 -1
# 获取编号0到编号2的
lrange l1 0 2
rpop: d出列表尾部(右侧)的元素
1
rpop l1
lpop: d出头部(左侧)的元素
1
lpop l1
lrem : 删除指定值
LREM key count value
如果count < 0, 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
如果count > 0, 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
如果count = 0, 移除表中所有与 VALUE 相等的值。
1
lrem l3 -2 a
1
lrem l3 -2 c
1
lrem l3 0 b
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。
Redis能运行在大多数POSIX(Linux, BSD, OS X 和Solaris等)系统上,官方没有支持Windows的版本。目前最新的版本是2211,这个版本主要是修复了一个227版本中遍历方式优化带来的一个bug。
和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构,丰富了Redis的应用场景,能满足更多业务上的灵活存储需求。
Redis的数据都保存在内存中,而且底层实现上是自己写了epoll event loop部分,而没有采用开源的libevent等通用框架,所以读写效率很高。为了实现数据的持久化,Redis支持定期刷新(可通过配置实现)或写日志的方式来保存数据到磁盘。
1、数据类型
作为Key-value型数据库,Redis也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis的键值还可以是以下形式之一:
●Lists (列表)
●Sets (集合)
●Sorted sets (有序集合)
●Hashes (哈希表)
键值的数据类型决定了该键值支持的 *** 作。Redis支持诸如列表、集合或有序集合的交集、并集、查集等高级原子 *** 作;同时,如果键值的类型是普通数字,Redis则提供自增等原子 *** 作。
2、持久化
通常,Redis将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:使用截图的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。
3、主从同步
Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。
4、性能
相比需要依赖磁盘记录每个更新的数据库,基于内存的特性无疑给Redis带来了非常优秀的性能。读写 *** 作之间有显著的性能差异。
5、提供API的语言
●C
●C++
●C#
●Clojure
●Common Lisp
●Erlang
●Haskell
●Java
●Javascript
●Lua
●Objective-C
●Perl
●PHP
●Python
●Ruby
●Scala
●Go
●Tcl
6、适用场合
毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据 *** 作,为不同的大象构建不同的冰箱。希望你喜欢这个比喻。
下面是Redis适用的一些场景:
(1)、取最新N个数据的 *** 作
比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取。
使用LPUSH latestcomments命令,向list集合中插入数据
插入完成后再用LTRIM latestcomments 0 5000命令使其永远只保存最近5000个ID
然后我们在客户端获取某一页评论时可以用下面的逻辑
FUNCTION get_latest_comments(start,num_items):
id_list = redislrange("latestcomments",start,start+num_items-1)
IF id_listlength < num_items
id_list = SQL_DB("SELECT ORDER BY time LIMIT ")
END
RETURN id_list
END
如果你还有不同的筛选维度,比如某个分类的最新N条,那么你可以再建一个按此分类的List,只存ID的话,Redis是非常高效的。
二者数据同步的关键在于mysql数据库中主键,方案是在redis启动时区mysql读取所有表键值存入redis中,往redis写数据是,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。
参考代码如下:
String tbname = "login";
//获取mysql表主键值--redis启动时
long id = MySQLgetID(tbname);
//设置redis主键值--redis启动时
redisServiceset(tbname, StringvalueOf(id));
Systemoutprintln(id);
long l = redisServiceincr(tbname);
Systemoutprintln(l);
Login login = new Login();
loginsetId(l);
loginsetName("redis");
redisServicehmset(StringvalueOf(logingetId()), login);
boolean b = MySQLinsert("insert into login(id,name) values(" + logingetId()
+ ",'" + logingetName() + "')");
/
队列处理器更新mysql失败:
清除缓存数据,同时主键值自减
/
if (!b)
{
redisServicedelKeyAndDecr
(tbname, "Login:"+StringvalueOf(logingetId()));
// redisServicedelete("Login:"+StringvalueOf(logingetId()));
//redisServicedecr(tbname);
}
Systemoutprintln(redisServiceexists("Login:"+StringvalueOf(logingetId())));
Systemoutprintln(redisServiceget(tbname));
以上就是关于如何用redis来生成唯一Id全部的内容,包括:如何用redis来生成唯一Id、redis如何在shell中建表、redis 放入的值何时会没有等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)